UDP服务recvfrom函数设置非阻塞
大家好,又见面了,我是你们的朋友全栈君。
本文先介绍我查看了的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
相关文章
- 在Feign中使用Hystrix实现服务调用容错
- Flash插件安装了,但没有FlashHelperService服务怎么办?
- Android平台实现mp4文件实时推送RTMP|轻量级RTSP服务|GB28181平台
- 精读此文后你会感觉之前对微服务核心模块-服务注册中心一无所知
- 函数即服务,一步到位!
- 苹果APNS推送服务
- Nacos组件(服务注册中心测试)
- 游戏服务的分布式事务优化(一)- Write Ahead Log(WAL) 模块
- 【Android 安全】深思数盾 Virbox 加固应用 ( 购买加固服务 | 下载加固软件 | 启动加固软件 | 函数 VMP 壳设置 | 加密选项 | 资源加密 | SO 保护 )
- Linux服务自动开机启动(linux服务开机自启动)
- Redis服务漏洞破解:SSH 攻击预防(redis漏洞ssh)
- Oracle服务器挂掉了!(oracle服务没有了)
- Redis实现的高效注册服务(redis注册服务)
- 如何在Linux中正确绑定DHCP服务?(linux绑定dhcp)
- 如何解决MySQL无法关闭服务的问题(mysql不能关闭服务)
- 精简微服务架构 内嵌Redis实现快速数据存储(内嵌redis)