- 注册时间
- 2021-4-16
- 最后登录
- 2023-9-20
- 在线时间
- 2 小时
编程入门
- 龙马币
- 40
|
flags为recv的第四个参数
flags = MSG_DONTWAIT
返回读取数据的长短,如当队列中没有数据时,返回-1。并且errno==EWOULDBLOCK。
可以用于当事件触发时,对信息进行接收,当接收到尾部时,队列空了,再次调用recv时会返回-1,此时如errno为EWOULDBLOCK时,就可以判定接收结束。
既提示你的应用程序现在没有数据可读请稍后再试。
等待下一次事件触发。
flags=0
正常的阻塞接收模式。
IO模式设置:
一般对于一个socket 是阻塞模式还是非阻塞模式有两种方式::
方法1、fcntl 设置;
方法2、recv,send 系列的参数。(读取,发送时,临时将sockfd或filefd设置为非阻塞)
方法一、fcntl 函数可以将一个socket 句柄设置成非阻塞模式:
- flags = fcntl(sockfd, F_GETFL, 0); //获取文件的flags值。
- fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); //设置成非阻塞模式;
- flags = fcntl(sockfd,F_GETFL,0);
- fcntl(sockfd,F_SETFL,flags&~O_NUNBLOCK); //设置成阻塞模式;
复制代码 设置之后每次的对于sockfd 的操作都是非阻塞的。
方法二、recv, send 函数的最后有一个flag 参数可以设置成MSG_DONTWAIT
临时将sockfd 设置为非阻塞模式,而无论原有是阻塞还是非阻塞。
- recv(sockfd, buff, buff_size,MSG_DONTWAIT); //非阻塞模式的消息发送
- send(scokfd, buff, buff_size, MSG_DONTWAIT); //非阻塞模式的消息接受
复制代码
阻塞与非阻塞读的区别: //阻塞和非阻塞的区别在于没有数据到达的时候是否立刻返回.
|
|