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


相关推荐

  • Jenkins自动构建部署项目到远程服务器上

    Jenkins自动构建部署项目到远程服务器上1.下载jenkins下载地址:https://jenkins.io/启动jenkins方式有2种1.1切换到jenkins.war包的存放目录启动命令:java-jarjenkins.war启动jenkins访问:localhost:8080就能…

    2022年6月2日
  • WinINet 与 WinHTTP简介

    WinINet 与 WinHTTP简介之前一直有听到WinHTTP和WinINet这两种网络服务,是Microsoft提供的两套API,但一直没有系统的用过,趁次机会一起来将这个整理一下。    首先了解一下WinINet:    WinInet,全称TheMicrosoftWindowsInternet,应用程序可以通过它提供的API访问标准的网络协议,比如FTP和HTTP等。WinINet不支持服务端的

    2022年7月11日
  • layuiadmin配置mysql_layuiAdmin 后台管理模板

    layuiadmin配置mysql_layuiAdmin 后台管理模板完全由layui自有的前端架构实现而成的一套通用型后台管理模板系统iframe版使用简单基于iframe标签页实现,简单实用传统开发模式,撸起袖子直接开干交互体验相比“单页版”略有点欠缺始终基于全新的layui版本面向全屏幕尺寸的响应式适配能力灵活的主题色配置专属的开发者文档,助你快速掌握版本的持续更新,集大众之所需layui社区VIP标识专属的会员专区,与同道中人隔空交流不限制…

    2022年10月29日
  • Java在线考试系统(含源码)[通俗易懂]

    Java在线考试系统(含源码)[通俗易懂]本文demo下载和视频教学观看地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1076本实例介绍了在线考

    2022年8月6日
  • 快速幂的大数运算_快速幂模

    快速幂的大数运算_快速幂模快速幂运算1.什么是快速幂2.快速幂的“小数”运算3.高精度(大数)的快速幂1.什么是快速幂快速幂,是指在进行幂运算的时候,用一种快速方法得出答案。比如,要求2^100的值,那按照最简单的方式,就是一个一个2去相乘,然后最终得到答案,那么这样就要计算100次,非常浪费时间,那么快速幂就是使用一种技巧使得将其计算次数减少,快速得到答案。2.快速幂的“小数”运算对于系统内置类型的整型,暂且叫他“小数”,这个时候进行快速幂运算,代码如下:#include<cstdio>#include&l

    2022年10月27日
  • docker dockerfile详解_docker exec 进入容器

    docker dockerfile详解_docker exec 进入容器前言Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。Dockerfile简介Dockerfile是用来构建Docker镜像的构建文件,是由一系列

    2022年7月28日

发表回复

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

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