当前位置: 首页 > news >正文

TCP/IP socket

## TCP Socket
收发缓冲区:
每个socket在linux内核中都有一个发送缓冲区和一个接收缓冲区。
只要对端将数据发送过来,linux内核TCP/IP协议栈就会负责将数据缓存到socket对应的接收缓冲区中,无论是否调用recv。
recv()所做的工作,只是把内核缓冲区中的数据拷贝到应用层用户的buffer里面。
调用send()发送的数据的时候,只是将应用层buffer中数据拷贝进入socket的内核发送缓冲区之中,然后send便会在上层返回(注意:数据是否发送过去不一定)。
linux内核TCP/IP协议栈负责将数据发送到对端。

异常场景:
应用进程一直没有读取数据,导致接受缓冲区满了。此时接收端通知发送端,接收窗口关闭,保证接收缓冲区不会溢出。(TCP流控机制 滑动窗口法)


socket内核发送缓冲区的默认大小 (16KB)
cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4161536


## Errors:socket层标准错误
These are some standard errors generated by the socket layer.

EAGAIN or EWOULDBLOCK: socket被标记为非阻塞,当recv操作阻塞或者接收超时。
The socket is marked nonblocking and the receive operation would block, or a receive timeout had been set and the timeout expired before data was received.

EBADF: 无效socket
The argument sockfd is an invalid descriptor.

ECONNREFUSED: 远程主机拒绝网络连接
A remote host refused to allow the network connection (typically because it is not running the requested service).

EFAULT: 内存越界
The receive buffer pointer(s) point outside the process's address space.

EINTR: 被信号打断
The receive was interrupted by delivery of a signal before any data were available; see signal(7).

EINVAL: 参数无效
Invalid argument passed.

ENOTCONN: 没有建连的socket
The socket is associated with a connection-oriented protocol and has not been connected.

## 1: socket
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
domain : AF_UNIX--本地socket
         AF_INET--ipv4
         AF_INET--ipv6
type: SOCKT_STREAM--TCP
      SOCKT_DGRAM—UDP

## 2: socket reuse (ip复用 或者port复用)
一个socket的五元组:
{<protocol>, <src addr>, <src port>, <dest addr>, <dest port>}
(1) non-reuse 
如果指定src addr为0.0.0.0,将不再表示某一个具体的地址,而是表示本地的所有的可用地址。
指定src addr为0.0.0.0,将不再表示某一个具体的地址,而是表示本地的所有的可用地址。

reuse有三个级别:
non-reuse: (src addr,src port)不能冲突。eg: ip1:port1和ip2:port1不冲突。0.0.0.0:port1和ip1:port1冲突。
             0.0.0.0和其他IP冲突。
reuse-addr: (src addr,src port)不能冲突。 eg: ip1:port1和ip2:port1不冲突。0.0.0.0:port1和ip1:port1不冲突。
             0.0.0.0和其他IP不冲突。
reuse-port: (src addr,src port)可以冲突。eg: 0.0.0.0:port1和0.0.0.0:port1不冲突。

## 使用setsockopt()设置复用。
设置reuse-addr:
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int));
设置reuse-port:
setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &(int){1}, sizeof(int));


## 3: recv
定义:
The recv() function is normally used only on a connected socket

原理:
recv只是将socket对应的接收缓冲区的数据copy到buffer中,真正的是Linux内核的TCP/IP网络协议栈负责接收数据。

接口:
    #include <sys/socket.h>
    ssize_t recv(int socket, void *buffer, size_t length, int flags);

参数:socket:
     buffer: 缓冲区。
     length: buffer的长度
     flags: 一般设置为0.

返回值:>0: 返回接收的字节数 -1:发生错误 0:对端关闭了连接 (无论阻塞还是非阻塞,返回值的都是这3钟)
    These calls return the number of bytes received, or -1 if an error occurred。
    For TCP sockets, the return value 0 means the peer has closed its half side of the connection.

阻塞与非阻塞:
阻塞: 默认为阻塞。没有数据时,recv函数将一直等待获取到数据,或者发生报错。
非阻塞: 没有数据时,不会阻塞着读数据,而是返回-1(需要判断errno),需要循环读取数据。

在返回值处理上:
阻塞: 缓冲区有数据,成功执行返回接收到的字节数(>0)。
      另一端关闭(=0)。
      缓冲区无数据,阻塞一直等。
      连接失败(-1), errno = ENOCONN。
非阻塞:缓冲区有数据,成功执行返回接收到的字节数 (>0)。
      另一端关闭(=0).
      缓冲区无数据,立即返回, 返回值为-1, 同时errno = EAGAIN || EWOULDBLOCK。
      连接失败(-1), errno = ENOCONN。

## 4: 设置阻塞方式
(1) sock = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
或者
(2) int flag = fcntl(sock, F_F_GETFL);fcntl(sock, F_SETFL, flag | O_NONBLOCK);


## 5: connect
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

connect: 默认为阻塞式的。

非阻塞connect实现机制:
a: 创建socket,利用fcntl将其设置为非阻塞。
b: 调用connect函数,如果返回0,则连接建立;如果返回-1,检查errno ,如果值为 EINPROGRESS,则连接正在建立。如果值不是EINPROGRESS,建连错误。
c: 调用阻塞式接口select/pool检测是否连接建立。这里对于select/pool可以采用设置超时时间来等待。
d: 在select/pool的超时时间内成功建立,返回成功建连。否则调用getsockopt获取错误信息。

示例:
https://blog.csdn.net/qq_43684922/article/details/106444292?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-106444292-blog-119000780.235^v27^pc_relevant_t0_download&spm=1001.2101.3001.4242.1&utm_relevant_index=3


## send

#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);

返回值: > 0 发送的的数据字节数。 -1发送发生错误, 查看errno。=0 N/A
Return Value
On success, these calls return the number of characters sent. 
On error, -1 is returned, and errno is set appropriately.

阻塞与非阻塞:
在阻塞模式下,send函数的过程是将应用程序请求发送的数据拷贝到内核发送缓存中,待发送数据完全被拷贝到内核发送缓存区中才返回,当然如果内核发送缓存区一直没有空间能容纳待发送的数据,则一直阻塞。
When the message does not fit into the send buffer of the socket, send() normally blocks。
(1)如果内核发送缓冲区可用大小为0,send()直接堵塞
(2)如果内核发送缓冲区可用空间小于待发送的数据长度len,则send()函数会先把部分数据拷贝到内核发送缓冲区中,然后会阻塞等待有空间,再将剩余数据发送到内核缓冲区。
(3)如果待发送数据的长度大于s的内核发送缓冲区的长度时,会先将s(发送端)的内核发送缓冲区填满,然后发送端会将内核发送缓冲区的数据发送到接收端socket的内核接收缓冲区,所以s(发送端)的内核发送缓冲区又会慢慢腾出空间,send又会将待发送数据往s(发送端)的内核发送缓冲区中copy。

在非阻塞模式下,send函数的过程也是将应用程序请求发送的数据拷贝内核发送缓存中。
send函数不需要等到待发送数据完全被拷贝到内核发送区中才返回。
如果内核缓存区可用空间不够容纳所有待发送数据,则尽能力的拷贝,返回成功拷贝的大小;
如果缓存区可用空间为0,则返回-1,同时设置errno为EAGAIN.
In nonblocking mode it would fail with the error EAGAIN or EWOULDBLOCK in this case. The select(2) call may be used to determine when it is possible to send more data.

errno:
EBADF 参数s 非合法的socket处理代码。
EFAULT 参数中有一指针指向无法存取的内存空间
ENOTSOCK 参数s为一文件描述词,非socket。
EINTR 被信号所中断。
EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。
ENOBUFS 系统的缓冲内存不足
ENOMEM 核心内存不足
EINVAL 传给系统调用的参数不正确
 

相关文章:

TCP/IP socket

## TCP Socket 收发缓冲区: 每个socket在linux内核中都有一个发送缓冲区和一个接收缓冲区。 只要对端将数据发送过来&#xff0c;linux内核TCP/IP协议栈就会负责将数据缓存到socket对应的接收缓冲区中&#xff0c;无论是否调用recv。 recv()所做的工作&#xff0c;只是把内核缓…...

“工作三年,跳槽要求涨薪50%”,合理吗?

如果问在TI行业涨工资最快的方式是什么&#xff1f;回答最多的一定是&#xff1a;跳槽&#xff01;前段时间&#xff0c;知乎上这样一条帖子引发了不少IT圈子的朋友的讨论 &#xff0c;有网友提问 “程序员跳槽要求涨薪50%过分吗&#xff1f;”截图来源于知乎&#xff0c;如侵删…...

Vue学习计划九:了解Vue动画效果以及过渡动画和动态组件的使用方法

Vue.js 是一个流行的 JavaScript 框架&#xff0c;它提供了很多工具和功能&#xff0c;可以帮助开发人员创建动态、交互式的 Web 应用程序。其中之一就是动画效果&#xff0c;Vue.js 提供了一系列的 API 和指令&#xff0c;使得添加动画效果变得非常容易。 在 Vue.js 中&#…...

【Linux】进程理解与学习Ⅲ-环境变量

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;相关文章推荐&#xff1a;【Linux】冯.诺依曼体系结构与操作系统【Linux】进程理解与学习Ⅰ-进程概念浅谈Linux下的shell--BASH【Linux】进程理解与学习…...

【三】一起算法---栈:STL stack、手写栈、单调栈

纸上得来终觉浅&#xff0c;绝知此事要躬行。大家好&#xff01;我是霜淮子&#xff0c;欢迎订阅我的专栏《算法系列》。 学习经典算法和经典代码&#xff0c;建立算法思维&#xff1b;大量编码让代码成为我们大脑的一部分。 ⭐️已更系列 1、基础数据结构 1.1、链表➡传送门 1…...

电路设计的一些概念

锁存器的产生 论述1 (转)时序电路&#xff0c;生成触发器&#xff0c;触发器是有使能端的&#xff0c;使能端无效时数据不变&#xff0c;这是触发器的特性。 组合逻辑&#xff0c;由于数据要保持不变&#xff0c;只能通过锁存器来保存。 第一个代码&#xff0c;由于是时序逻…...

【Linux】Linux下权限的理解

前言&#xff1a;在之前我们已经对基本的指令进行了深入的学习&#xff0c;接下来我将带领大家学习的是关于权限的相关问题。在之前&#xff0c;我们一直是使用的【root】用户&#xff0c;即为“超级用户”&#xff0c;通过对权限的学习之后&#xff0c;我们就会慢慢的切换到普…...

Prometheus监控实战系列十七:探针监控

目前对于应用程序的监控主要有两种方式&#xff0c;一种被称为白盒监控&#xff0c;它通过获取目标的内部信息指标&#xff0c;来监控目标的状态情况&#xff0c;我们前面介绍的主机监控、容器监控都属于此类监控。另一种则是“黑盒监控”&#xff0c;它指在程序外部通过探针的…...

题目:JPA的懒加载失效是什么情况?

题目&#xff1a;JPA的懒加载失效是什么情况&#xff1f;Q1&#xff1a;什么是JPA的懒加载&#xff1f;Q2&#xff1a;JPA的懒加载会在什么情况下失效&#xff1f;Q3&#xff1a;如何避免JPA的懒加载失效&#xff1f;前言&#xff1a;在使用JPA进行数据库操作时&#xff0c;懒加…...

十六、消息推送

一、什么是消息推送&#xff1f; 消息推送通常是指网站的运营工作等人员&#xff0c;通过某种工具对用户当前网页或移动设备 APP 进行的主动消息推送。 消息推送一般又分为 Web 端消息推送和移动端消息推送。 消息推送无非是推&#xff08;push&#xff09;和拉&#xff08;p…...

PMP项目管理-【第一章】引论

项目知识体系&#xff1a; 项目管理知识体系&#xff1a; 1.1 项目特性 独特性&#xff1a;独特性会带来不确定性(风险) 临时性&#xff1a;1> 任何项目都有起始终止时间 2> 项目具备临时性&#xff0c;项目成果可能是永久的 1.2 项目驱动变革 从商业角度来看&#xff0c…...

前端布局小案例,分享3个漂亮的卡片组件

当今互联网发展迅猛&#xff0c;各种应用、网站和软件层出不穷&#xff0c;其中前端技术的发展更是让人瞩目。随着用户对于界面设计的要求越来越高&#xff0c;漂亮的卡片组件在各类网页设计中变得越来越流行。本文将分享三个精美的卡片组件&#xff0c;帮助您在前端开发中轻松…...

博客重载记录

博客重载记录流控算法实现open系统调用流程二分查找前言&#xff1a; 有时候看了一些比较好的文章&#xff0c;过几天就忘了&#xff0c;想想不如自己实现一遍博客代码或按博客结构自己写一遍&#xff0c;加深印象&#xff0c;但把别人的内容改个名字变成自己的博客&#xff0c…...

open-cv绘制简单形状line() circle() rectangle() polylines() putText() cvtColor()

OpenCV彩色图像中一个像素是按照“B-G-R”模式组织的。 绘图函数的一些公众参数&#xff1a; img &#xff1a;图像对象 color&#xff1a; 颜色&#xff0c;如果彩色用一个三元组表示&#xff0c;三元组的元素按照B-G-R组织&#xff0c;三元组(0,255,0)中B为0&#xff0c;G为2…...

基于 PyTorch + LSTM 进行时间序列预测(附完整源码)

时间序列数据&#xff0c;顾名思义是一种随时间变化的数据类型。 例如&#xff0c;24小时内的温度、一个月内各种产品的价格、某家公司一年内的股票价格等。深度学习模型如长短期记忆网络&#xff08;LSTM&#xff09;能够捕捉时间序列数据中的模式&#xff0c;因此可以用于预…...

GEE页面介绍

目录一、背景二、用户界面三、数据类型&#xff1a;栅格1、请求图像集合2、学习查看栅格元数据3、矢量实例一&#xff1a;四、数据集五、数据属性1、空间分辨率2、时间分辨率六可视化多个波段1、真彩色(TCI)2彩色红外&#xff08;CI&#xff09;3、伪色 1 和 2 (FC1/FC2)七、可…...

python自动发送邮件,qq邮箱、网易邮箱自动发送和回复

在python中&#xff0c;我们可以用程序来实现向别人的邮箱自动发送一封邮件&#xff0c;甚至可以定时&#xff0c;如每天8点钟准时给某人发送一封邮件。今天&#xff0c;我们就来学习一下&#xff0c;如何向qq邮箱&#xff0c;网易邮箱等发送邮件。 一、获取邮箱的SMTP授权码。…...

hastcat

hashcat 下载地址: https://hashcat.net/hashcat/ 案例 Usage: hashcat [options]... hash|hashfile|hccapxfile [dictionary|mask|directory]...https://xz.aliyun.com/t/4008破解linux shadow /etc/shadow中密码格式: $id$salt$encrypted如:$1$2eWq10AC$NaQqalCk3 1表…...

242. 一个简单的整数问题

Powered by:NEFU AB-IN Link 文章目录242. 一个简单的整数问题题意思路代码242. 一个简单的整数问题 题意 给定长度为 N的数列 A&#xff0c;然后输入 M行操作指令。 第一类指令形如 C l r d&#xff0c;表示把数列中第 l∼r个数都加 d 第二类指令形如 Q x&#xff0c;表示询问…...

docker安装Redis高可用(一主二从三哨兵)

本次教程使用docker swarm安装 准备三台机器 hostIP用途node1192.168.31.130redis-master01&#xff0c;redis哨兵节点01node2192.168.31.131redis-slave01, redis哨兵节点02node3192.168.31.132redis-slave02 redis哨兵节点02 注意事项&#xff1a; 1&#xff1a;需要保证三…...

安全防御之入侵检测篇

目录 1.什么是IDS&#xff1f; 2.IDS和防火墙有什么不同&#xff1f;3.IDS的工作原理&#xff1f; 4.IDS的主要检测方法有哪些&#xff1f;请详细说明 5.IDS的部署方式有哪些&#xff1f; 6.IDS的签名是什么意思&#xff1f;签名过滤器有什么用&#xff1f;例外签名的配置作…...

学习系统编程No.10【文件描述符】

引言&#xff1a; 北京时间&#xff1a;2023/3/25&#xff0c;昨天摆烂一天&#xff0c;今天再次坐牢7小时&#xff0c;难受尽在不言中&#xff0c;并且对于笔试题&#xff0c;还是非常的困难&#xff0c;可能是我做题不够多&#xff0c;也可能是没有好好的总结之前做过的一些…...

网络基础认识

目录 一、计算机网络背景 1.1 网络发展 1.2 "协议"由来 二、网络协议初识 2.1 协议分层 2.2 OSI七层模型 2.3 TCP/IP五层模型 三、网络协议栈 四、数据包封装与分用 五、网络传输基本流程 5.1 同局域网的两台主机通信 5.2 跨网络的两台主机通信 六、网络…...

【蓝桥杯_练习】

蓝桥杯1.创建工程2.LED灯点亮led.c3.LCD液晶屏显示lcd.c4.定时器按键单机interrupt.hinterrupt.cman.c5.定时器&#xff08;长按键&#xff09;interrupt.hinterrupt.cmain.c6.PWMmain.c7.定时器-输入捕获&#xff08;频率&#xff0c;占空比测量&#xff09;interrupt.cmain.c…...

【C语言蓝桥杯每日一题】——跑步锻炼

【C语言蓝桥杯每日一题】—— 跑步锻炼&#x1f60e;前言&#x1f64c;排序&#x1f64c;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#xff01;&#xff01;&#xff01; &#x1f60a;作者简介…...

Qt之实现类似软件安装时的新功能介绍界面

一.效果 在软件安装时,一般会轮播软件的新功能,安装后,如果还想查看这些新功能该怎么办呢,我们可以把这个介绍新新功能的小应用集成到软件的“帮助”菜单中,比起纯黑文字的无趣介绍,图文方式的呈现会生动得多。 最近在看《赘婿》,借几张图过来用用。 二.原理 1.分层结…...

echarts地图不同地区设置不同的颜色

var myChart ec.init(document.getElementById(main));let option {tooltip: {trigger: item,},dataRange: {//左下角的颜色块。start&#xff1a;值域开始值&#xff1b;end&#xff1a;值域结束值&#xff1b;label&#xff1a;图例名称&#xff1b;color&#xff1a;自定义…...

网易云音乐API部署Vercel获取接口过程

前提&#xff1a;部署自己的网易云接口主要用途在于在完成前端的仿网易云播放器的时候&#xff0c;根据自己部署的接口可以用于获取数据。大体流程是通过在github上fork别人的API接口项目&#xff0c;然后在Vercel部署即可获得自己的网易云后端数据接口了&#xff0c;不过根据我…...

Java基础:字符串(String)及常用操作

目录 字符串的声明及创建 字符串的操作 连接字符串&#xff08;或concat&#xff09; 获取字符串的长度 length 查找字符串 indexOf 获取字符串某个位置的字符 charAt 查询某个字符串是否存在 contains 截取字符串 substring&#xff08;一&#xff09; 截取字符串 su…...

FL Studio 21中文版支持主题随心换,FL Studio 21Mac版新增对苹果M2/1家族芯片原生支持。

FL Studio 21.0.0 官方中文版重磅发布 纯正简体中文支持&#xff0c;更快捷的音频剪辑及素材管理器&#xff0c;多样主题随心换&#xff01; Mac版新增对苹果M2/1家族芯片原生支持。 更新版本&#xff1a;21.0.0支持语言&#xff1a;简体中文/英语更新时间&#xff1a;2022.12…...

政府网站站群建设方案/搜索引擎技巧

Spring-Boot-2.0.0-M1版本将默认的数据库连接池从tomcat jdbc pool改为了hikari&#xff0c;这里主要研究下hikari的默认配置 0. 创建Spring Boot项目&#xff0c;选中 Web、MySQL、JDBC 依赖 1. 启动类默认加载了DataSourceAutoConfiguration&#xff0c;默认数据源是HikariD…...

建站推广哪里有建站新闻资讯/友情链接站长平台

Python格式化输出的方法要使用 格式化字符串字面值 &#xff0c;请在字符串的开始引号或三引号之前加上一个 f 或 F 。在此字符串中&#xff0c;你可以在 { 和 } 字符之间写可以引用的变量或字面值的 Python 表达式。>>> yes_votes 42_572_654>>> no_votes …...

移动端 pc网站开发/b2b免费发布信息平台

为什么需要封装echarts 每个开发者在制作图表时都需要从头到尾书写一遍完整的option配置&#xff0c;十分冗余在同一个项目中&#xff0c;各类图表设计十分相似&#xff0c;甚至是相同&#xff0c;没必要一直做重复工作可能有一些开发者忘记考虑echarts更新数据的特性&#xf…...

自建站怎么接入支付/拉新推广怎么找渠道

一、概述 原始视频帧&#xff08;最原始的视频数据&#xff09;根据编码的需要&#xff0c;以不同的方式进行扫描产生两种视频帧&#xff1a;连续或隔行视频帧&#xff0c;隔行视频帧包括顶场和底场&#xff0c;连续&#xff08;遂行&#xff09;扫描的视频帧与隔行扫描视频帧有…...

做标识的网站 知乎/seo优质友链购买

安装了nodemon第三方库以后&#xff0c;使用nodemon .\01.helloworld.js命令&#xff0c;出现如下错误&#xff1a; 解决办法&#xff1a; 管理员身份打开powerShell 将鼠标定位到左下角“开始菜单”处&#xff0c;右键&#xff0c;选择“Windows PowerShell&#xff08;管理…...

改图网在线制作图片/网站seo主要是做什么的

来源&#xff1a;数据学堂本文来源于网络&#xff0c;如有侵权&#xff0c;联系浪尖删除&#xff1a;langjianliaodashuju全文共7596个字&#xff0c;建议阅读12分钟由于在变化快速的商业世界里&#xff0c;业务形态多种多样&#xff0c;为了能够更有针对性的进行数据建模&…...