前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UDP服务recvfrom函数设置非阻塞

UDP服务recvfrom函数设置非阻塞

作者头像
全栈程序员站长
发布2022-09-15 11:43:33
2K0
发布2022-09-15 11:43:33
举报
文章被收录于专栏:全栈程序员必看

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

本文先介绍我查看了的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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2篇博文
  • 非阻塞设置
  • 在非阻塞情况下,怎么判断接收了呢?
  • 新的补充:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档