UDP服务recvfrom函数设置非阻塞

UDP服务recvfrom函数设置非阻塞本文先介绍我查看了的2篇文章,然后介绍linux和windows下的非阻塞设置。最后是非阻塞情况下接收情况的判断。2篇博文其实UDP的非阻塞也可以理解成和TCP是一样的,都是通过socket的属性去做。方法一:通过fcntl函数将套接字设置为非阻塞模式。方法二:通过套接字选项SO_RECVTIMEO设置超时。https://blog.csdn.net/daiyudong20…

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

本文先介绍我查看了的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.net/163435.html原文链接:https://javaforall.net

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Etcd – 分布式配置中心

    Etcd – 分布式配置中心Etcd简介Etcd是一种分布式kv存储设施,他具有一定的一致性,高性能,高可用的方案.类似的zookeeper,但没有zookeeper那么重型,功能也没有覆盖那么多.简单直接的应用就是配置中心架构设计总览clients为多个需要配置的服务,中间层为多个grpc-proxy做均衡负载,以免一个proxy挂了之后导致单点问题.grpc…

    2025年6月22日
    8
  • python虚拟环境virtualenv_怎样用pycharm写代码

    python虚拟环境virtualenv_怎样用pycharm写代码环境:win10python2.7.10(64)在path中配置python环境D:\Develop\Python27\ScriptsD:\Develop\Python27\安装virtualenvcmd>pipinstallvirtualenv建立virtualenv进入一个希望创建虚拟python环境的文件夹下面cmd>D:>cdvirtualenvcmd>D:\virtua

    2022年8月29日
    3
  • drf 教程_drm限制

    drf 教程_drm限制一、drf的安装1djangorestframework:django的app,只能再django上使用-djangorestframework是django的一个app,更快速在django框

    2022年8月6日
    6
  • 矩阵乘以其矩阵转置「建议收藏」

    矩阵乘以其矩阵转置「建议收藏」在推导公式和计算中,常常能碰到矩阵乘以其矩阵转置,在此做个总结。1.假设矩阵A是一个m∗nm∗nm*n矩阵,那么A∗ATA∗ATA*A^T得到一个m∗mm∗mm*m矩阵,AT∗AAT∗AA^T*A得到一个n∗nn∗nn*n的矩阵,这样我们就能得到一个方矩阵。看一个例子:Xθ=HXθ=HX\theta=H求解θθ\theta.XTXθ=XTHXTXθ=XT…

    2022年6月30日
    35
  • 三自由度机械臂的三维设计

    三自由度机械臂的三维设计三自由度机械臂的三维设计背景底座背景写本篇文章的时候只是模型设计完成以及部分零件进行了采购,最终是否能实现不能确定。继续之前的智能车制作,我的想法是一个多功能的智能小车它至少得有手有眼吧,所以继摄像头云台的制作结束后我又进行了机械臂的设计,最初对于机械臂的了解真的是非常的少,当时的想法是一个关节一个舵机呗,大概是这样:但是我觉得这样有点丑,而且这样的话用的舵机也不少,不是很物美价廉,所有我…

    2022年6月7日
    33
  • Mybatis中的resultType和resultMap

    一、概述MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对

    2022年4月6日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号