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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java public interface_Java 接口interface的基础[通俗易懂]

    java public interface_Java 接口interface的基础[通俗易懂]原标题:Java接口interface的基础定义接口的时候是由关键字interface来定义自己是一个接口,格式如下:interface接口名接口体中包含常量的声明和抽象方法两部分接口体中只有抽象方法,没有普通的方法,而且接口体中所有的常量的访问权限一定都是public,而且是static常量,所有的抽象方法的访问权限一定都是public;eg:interfaceA{publicstati…

    2022年7月16日
    11
  • excel怎么赋值0和1_excel如何分段赋值

    excel怎么赋值0和1_excel如何分段赋值getCell 获取列 需要用 createCell获取即可。导出报表时,明明是有数据的可就是报空指针异常。排查后发下报表表格没内容时不能用。

    2022年8月19日
    6
  • Qt多线程通信

    Qt多线程通信简述:1>Qt线程间共享数据主要有两种方式:1)使用共享内存。即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的。2)使用singal/slot机制,把数据从一个线程传递到另外一个线程。第一种方法在各个编程语言都普遍使用,而第二种方法是QT的特有的,本文主要介绍第二种。2>

    2022年6月19日
    207
  • matlab的fread函数的用法_matlab fread 大小端

    matlab的fread函数的用法_matlab fread 大小端fread函数常见用法:1、A=fread(fileID,sizeA,precision,skip,machinefmt) 2、A=fread(fileID)3、fread(fileID,sizeA)4、A=fread(fileID,sizeA,precision)5、A=fread(fileID,sizeA,precision,skip)6、A=fread(fileID,sizeA,p

    2022年9月13日
    0
  • jetbrains 激活码【最新永久激活】

    (jetbrains 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月26日
    1.7K
  • linux之Shell编程

    1.Shell编程思维导图

    2021年12月28日
    30

发表回复

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

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