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,因此需要循环发送。
IO(input output)主要指:文件IO,网络IO。今天我们重点讨论的是网络IO首先我们要对这两种IO操作有个宏观上的认识:上图描述的是文件IO的大致耗时,查阅资料可知:网络IO的耗时也是在微秒级别,跟磁盘IO差不多。从中我们能得出一些结论:CPU处理数据的速度远远大于IO准备数据的速度。因此网络IO性能优化是工程师们一直在努力的方向。
Socket
是什么呢?可能很多人对
socket
的认识是...
netstat -lntp命令可以看到我们服务器程序tcpServer的网络状态,Proto是服务类型这里为tcp的,
Recv
-Q是收到的消息数这里为0,
Send
-Q是发送的消息数这里为0,Local是本地绑定的IP地址这里是0.0.0.0,即任意地址绑定,Address是绑定的端口号这里是8080,Foreign为允许访问的远端主机IP,这里为任何远端主机,Address为允许访问的远端主机的端口,这里为任何远端主机的端口,State为当前套接字状态,这里为监听状态LISTEN。
read
()系统调用的原型:ssize_t
read
(int fd, void *buf, size_t count);
功能:从指定的文件描述符中读取最多count个字节的数据到指定的buf中去。如果传入的count是0,这个系统调用什么都不干,直接返回0。如果指定的count大于0,而且
返回值
也大于0,则表示函数执行成功,
返回值
表示成功读取的字节数,同时被读取的文件的当前数据指针会相应后移。...
阻塞
socket
和
非阻塞
socket
的区别读操作对于
阻塞
的
socket
/
recv
,当
socket
的接收缓冲区中没有数据时,
read
调用会一直
阻塞
住,直到有数据到来才返回。当
socket
缓冲区中的数据量小于期望读取的数据量时,返回实际读取的字节数。当sockt的接收缓冲区中的数据大于期望读取的字节数时,读取期望读取的字节数,返回实际读取的长度。对于
非阻塞
socket
而言,
socket
的接收缓冲区中有...
int
send
(
SOCKET
s, const char FAR *buf, int len, int flags );
不论是客户还是服务器应用程序都用
send
函数来向TCP连接的另一端发送数据。客户程序一般用
send
函数向服务器发送请求,而服务器则通常用
send
函数来向客户程序发送应答。
该函数的第一个参数指定发送端套接字描述符;
第二个参数指明一个存放应用程序要发送数据
在应用程序 A 与 应用程序 B 建立了 TCP 连接之后,假设应用程序 A 不断调用
send
函数,这样数据会不断拷贝至对应的内核缓冲区中,如果 B 那一端一直不调用
recv
函数,那么 B 的内核缓冲区被填满以后,A 的内核缓冲区也会被填满,此时 A 继续调用
send
函数会是什么结果呢?上面的示例验证了如果一端一直发数据,而对端应用层一直不取数据(或收取数据的速度慢于发送速度),则很快两端的内核缓冲区很快就会被填满,导致发送端调用
send
函数被
阻塞
。
recv
是
socket
编程中最常用的函数之一,在
阻塞
状态的
recv
有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结。
首先
阻塞
接收的
recv
有时候会返回0,这仅在对端已经关闭TCP连接时才会发生。
而当拔掉设备网线的时候,
recv
并不会发生变化
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:...
文章目录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
在默认
情况
下是
阻塞
状态的(未指异步操作以及其它一些特殊用途下,直接默认为
非阻塞
),这就使得发送以及接收操作处于
阻塞
的状态,即调用不会立即返..