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
在默认
情况
下是
阻塞
状态的(未指异步操作以及其它一些特殊用途下,直接默认为
非阻塞
),这就使得
发送
以及接收操作处于
阻塞
的状态,即调用不会立即返..