recv:
阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,
特别:非阻塞模式下返回 值 <0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况 下认为连接是正常的,继续接收。
只是阻塞模式下recv会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要 循环读取。
write:
阻塞与非阻塞write返回值没有区分,都是 <0:出错,=0:连接关闭,>0发送数据大小,
特别:非阻塞模式下返回值 <0时并且 (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的, 继续发送。
只是阻塞模式下write会阻塞着发送数据,非阻塞模式下如果暂时无法发送数据会返回,不会阻塞着 write,因此需要循环发送。
read:
阻塞与非阻塞read返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,
特别:非阻塞模式下返回 值 <0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况 下认为连接是正常的,继续接收。
只是阻塞模式下read会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要 循环读取。
send:
阻塞与非阻塞send返回值没有区分,都是 <0:出错,=0:连接关闭,>0发送数据大小,
特别:非阻塞模式下返回值 <0时并且 (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的, 继续发送。
只是阻塞模式下send会阻塞着发送数据,非阻塞模式下如果暂时无法发送数据会返回,不会阻塞着 send,因此需要循环发送。
int send ( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用 send 函数 来向TCP连接的另一端 发送 数据。客户程序一般用 send 函数 向服务器 发送 请求,而服务器则通常用 send 函数 来向客户程序 发送 应答。 该 函数 的第一个参数指定 发送 端套接字描述符; 第二个参数指明一个存放应用程序要 发送 数据 recv socket 编程中最常用的 函数 之一,在 阻塞 状态的 recv 有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结。       首先 阻塞 接收的 recv 有时候会返回0,这仅在 socket 被正常关闭时才会发生。       而当拔掉设备网线的时候, recv 并不会发生变化,仍然 阻塞 ,如果在这个拔网线阶段, socket 被关掉了,后果可能 IO(input output)主要指:文件IO,网络IO。今天我们重点讨论的是网络IO首先我们要对这两种IO操作有个宏观上的认识:上图描述的是文件IO的大致耗时,查阅资料可知:网络IO的耗时也是在微秒级别,跟磁盘IO差不多。从中我们能得出一些结论:CPU处理数据的速度远远大于IO准备数据的速度。因此网络IO性能优化是工程师们一直在努力的方向。 Socket 是什么呢?可能很多人对 socket 的认识是... send 函数 只负责将数据提交给协议层。    当调用该 函数 时, send 先比较待 发送 数据的长度len和套接字s的 发送 缓冲区的长度,如果len大于s的 发送 缓冲区的长度,该 函数 返回 SOCKET _ERROR;     如果len小于或者等于 阻塞 非阻塞 recv 返回值 没有区分,都是 0接收到数据大小, 特别: 非阻塞 下返回 值  只是 阻塞 recv 阻塞 着接收数据, 非阻塞 下如果没有数据会返回,不会 阻塞 着读,因此需要 循环读取。 write 阻塞 非阻塞 write 返回值 没有区分,都是 0 发送 数据大小, 特别: 非阻塞 返回值 只是 阻塞 write 阻塞 发送 数据, 非阻塞 下如果暂时无法 发送 在应用程序 A 与 应用程序 B 建立了 TCP 连接之后,假设应用程序 A 不断调用 send 函数 ,这样数据会不断拷贝至对应的内核缓冲区中,如果 B 那一端一直不调用 recv 函数 ,那么 B 的内核缓冲区被填满以后,A 的内核缓冲区也会被填满,此时 A 继续调用 send 函数 会是什么结果呢?上面的示例验证了如果一端一直发数据,而对端应用层一直不取数据(或收取数据的速度慢于 发送 速度),则很快两端的内核缓冲区很快就会被填满,导致 发送 端调用 send 函数 阻塞 recv socket 编程中最常用的 函数 之一,在 阻塞 状态的 recv 有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结。       首先 阻塞 接收的 recv 有时候会返回0,这仅在对端已经关闭TCP连接时才会发生。       而当拔掉设备网线的时候, recv 并不会发生变化 2、 socket 端点地址是区分唯一不同的系统中不同任务的通信连接。 bind() 函数 是将 socket 和端点地址绑定。 端点地址由32位主机IP地址和16位协议端口号组成。 将一个统配IP地址(INADDR_ANY)的端口绑定到一个so http://www.vxdev.com/docs/vx55man/vxworks/netguide/c- socket s.html http://www.vxdev.com/docs/vx55man/vxworks/ref/sockLib.html http://www.vxdev.com/docs/vx55man/vxworks/ref/pth read Lib.html http:... 当 socket Channel为 阻塞 时(默认就是 阻塞 read 函数 ,不会返回0, 阻塞 socket Channel,若没有数据可读,或者缓冲区满了,就会 阻塞 ,直到满足读的条件,所以一般 阻塞 read 是比较简单的,不过 阻塞 socket Channel的问题也是显而易见的。这里我结合基于NIO 写ftp服务器调试过程中碰到的问题,总结一下 非阻塞 场景下的 read 碰到的问题。注意:这里的场 文章目录1、参考文章:C++网络通信中 write read 的为什么会 阻塞 [2、参考文章:网络编程(24)—— linux中 write read 函数 阻塞 试验](https://blog.csdn.net/hyman_c/article/details/52979317)找 write 非阻塞 代码123我的代码10 一开始我写了个这样的 非阻塞 write 代码1 去掉循环 write 1、参考文章:C++网络通信中 write read 的为什么会 阻塞 现在要搞明白,如何让调用 write () 函数 的时候,先让它去判断 发送 缓冲 Socket 编程实现回声客户端 所谓“回声”,是指客户端向服务器 发送 一条数据,服务器再将数据原样返回给客户端。 下面实现 Windows 下的回声程序,Linux 下稍作修改即可。 server.cpp #include <stdio.h> #include <winsock2.h> #pragma comment (lib, "ws2_32.lib") //加载 ws2... xwdpepsi 最近在网络上看到一些帖子以及回复,同时又搜索了一些网络上关于 阻塞 非阻塞 区别的描述,发现很多人在描述两者的 发送 接收时操作返回以及缓冲区处理的区别时有不同程度的误解。所以我想写一篇文章来纠正错误,并作为记录方便查阅,如有转载,注明作者(jwybobo2007)以及出处即可。 首先 socket 在默认 情况 下是 阻塞 状态的(未指异步操作以及其它一些特殊用途下,直接默认为 非阻塞 ),这就使得 发送 以及接收操作处于 阻塞 的状态,即调用不会立即返..