zl程序教程

您现在的位置是:首页 >  其他

当前栏目

UDP服务recvfrom函数设置非阻塞

服务 函数 设置 阻塞 UDP recvfrom
2023-06-13 09:12:41 时间

大家好,又见面了,我是你们的朋友全栈君。

本文先介绍我查看了的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就变为不阻塞了。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163435.html原文链接:https://javaforall.cn