大家好,又见面了,我是你们的朋友全栈君。
本文先介绍我查看了的2篇文章,然后介绍linux 和windows 下的非阻塞设置。最后是非阻塞情况下接收情况的判断。
2篇博文
其实UDP的非阻塞也可以理解成和TCP是一样的,都是通过socket的属性去做。
方法一:通过fcntl函数将套接字设置为非阻塞模式。
方法二:通过套接字选项SO_RECVTIMEO设置超时。
https://blog.csdn.net/daiyudong2020/article/details/70039409 只是linux 下的情况
阻塞模式和非阻塞模式下send、sendto、recv、recvfrom的表现
https://blog.csdn.net/lp525110627/article/details/79742898
非阻塞设置
在linux 下用fcntl 函数
//设置非阻塞
static void setnonblocking(int sockfd) {
int flag = fcntl(sockfd, F_GETFL, 0); //取标志
if (flag < 0) {
Perror(“fcntl F_GETFL fail”);
return;
}
if (fcntl(sockfd, F_SETFL, flag | O_NONBLOCK) < 0) { //设置标志
Perror(“fcntl F_SETFL fail”);
}
}
在windows 下用ioctlsocket
//设置非阻塞
static void setnonblocking(int sockfd) {
unsigned long on = 1;
if (0 != ioctlsocket(sockfd, FIONBIO, &on))
{
/* Handle failure. */
}
}
在非阻塞情况下,怎么判断接收了呢?
看看函数说明
定义函数:int recvfrom(int s, void *buf, int len, unsigned int flags, struct sockaddr *from,int *fromlen);
函数说明:recvfrom()用来接收远程主机经指定的socket 传来的数据, 并把数据存到由参数buf 指向的内存空间, 参数len 为可接收数据的最大长度. 参数flags 一般设0, 其他数值定义请参考recvfrom(). 参数from 用来指定欲传送的网络地址, 结构sockaddr 请参考bind(). 参数fromlen 为sockaddr 的结构长度.
返回值:成功则返回接收到的字符数, 失败则返回-1, 错误原因存于errno 中.
利用返回值判断接收情况,如果没有接收到,返回为-1。
所以,接收情况的判断需要利用recvfrom 的返回值。
新的补充:
不用上面那样复杂,也可以直接用不阻塞标志,如下:
ret=recvfrom(sockfd,recvbuff,recvbufflen,MSG_DONTWAIT,( struct sockaddr *) &cliaddr, &clientlen); 就是flags标志不为0,而是MSG_DONTWAIT就变为不阻塞了。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163435.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...