关于recv、recvfrom的阻塞所遇到的问题(MSG_DONTWAIT)

这篇具有很好参考价值的文章主要介绍了关于recv、recvfrom的阻塞所遇到的问题(MSG_DONTWAIT)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

近期,在做网络通信时,需要开发出一个应用程序来随时更改转发的目标地址,并同时要一直接收别的主机发来的命令从而进行一系列操作。由于之前没有做过windows系统下的窗口程序开发,我开始一点一点学习怎么创建窗口,当应用界面大概成功的时候,出现了一个问题。就是我需要不断地去询问要不要改地址,有没有接收到新的命令。然而当我觉得只要把两个功能放在同一个循环中就可以实现时,却发现,两种功能有种互斥的感觉。当接收消息时,窗口界面的消息便获取不到,无法更改目标地址,我想着获取消息的功能里也没有写循环,怎么就一直出不来了呢?甚至想着将接收功能设置为守护进程,从而实现并发的效果,奈何之前一直在学习Linux系统,转过来发现Windows系统的进程创建要麻烦很多,又实在不理解为什么逻辑感觉没问题,会一直卡在那。我继续寻找问题所在,最后终于发现是因为接收函数处于阻塞状态,就是接不到消息我就一直在那接收,导致程序进行不下去。找到问题了,开始尝试解决,找到recv或recvfrom函数,这两个函数都是接收函数,看一下函数原型:

recv(SOCKET s,char *buf,int len,int flags);

recvfrom(SOCKET s,char *buf,int len,int flags,struct sockaddr *from,int *fromlen);

当recvfrom函数的后两个参数为NULL时也就和recv一样啦。解释一下各个参数:

s:套接字描述符;

buf:接收数据的缓冲区;

len:接收多长的数据;

flags:操作方式标志;(该问题主要出在这里,所以详细说一下)

一般设置为0:默认阻塞状态;(我这种情况就不一般,不能为0)

MSG_DONTWAIT:本次操作设置为不阻塞;(正常把flags参数改为这项就可以了,但它还是不一般,后面详聊)

MSG_PEEK:只用于接收函数,表示接收消息后在消息队列中保留原数据,不刷新缓冲区,只是从缓冲区查数据而不是取走数据;

MSG_WAITALL:要求阻塞操作;

还有很多其他标志,可以自行搜索,这里不再过多赘述;

后面两个参数只存在在recvfrom中,一般用来回传信息,表示已经接收到数据,增强数据传递的可靠性:

from:指向源地址缓冲区;

fromlen:指向源地址缓冲区长度;

将recvfrom函数的第四个参数由0改为MSG_DONTWAIT设置成非阻塞状态,继续测试发现找不到声明;

关于recv、recvfrom的阻塞所遇到的问题(MSG_DONTWAIT)

找不到声明,那就到头文件里看一下是不是写错了导致找不到宏定义,进入winsock2.h文件中查看发现,还真就没有这个定义;

关于recv、recvfrom的阻塞所遇到的问题(MSG_DONTWAIT)

后来查询资料发现,Linux系统里定义了很多宏来方便调用,但windows却没有,不要着急,不用急着将两个系统融合,还可以对套接字进行非阻塞设置;

找到windows系统的套接字设置函数ioctlsocket,也封装在winsock2.h头文件中,函数原型如下:

ioctlsocket(SOCKET s,__LONG32 cmd,u_long *argp);

s:套接字描述符;

cmd:对套接口s的操作命令;

argp:指向cmd所带参数的指针;

其中cmd也是包含很多命令,在这里我们用到FIONBIO,它表示支持或禁止套接口的非阻塞模式;

当cmd为FIONBIO时,argp为0表示阻塞状态,argp为1表示非阻塞状态;

所以,我们这里在套接字创建后对其进行设置:

关于recv、recvfrom的阻塞所遇到的问题(MSG_DONTWAIT)

编译通过,问题解决,特此记录!文章来源地址https://www.toymoban.com/news/detail-498164.html

到了这里,关于关于recv、recvfrom的阻塞所遇到的问题(MSG_DONTWAIT)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于写vscode ChatGPT插件遇到的一些问题

    出于对技术的专研想还原ChatGPT里面的一些交互,中间遇到遇到一些小问题做下总结 一、还原里面的富文本展示 chatgpt返回结果是这样的 最终实现效果 这里不仅还原了文本格式的展示,而且也还原了代码高亮。 可以看出chatgpt返回的是markdawn文本格式,要对markdawn文本格式做下

    2024年02月02日
    浏览(46)
  • 关于想使用kali中的foremost遇到的问题

    通过查找资料得知 kali 里中有 foremost 的 软件 包 , 于是我在kali中直接打开 终端 输入 foremost ,(由于过程中没截图抱歉) 它提示我没有这个软件并且问是否要下载,     (每个用户遇到的情况不一样,本文仅供参考) 我写下 y ,但它又说没有定位到 foremost 软件包 , 又通

    2024年02月11日
    浏览(34)
  • 关于安装Dubbo+zookeeper过程中遇到的许多问题

    在学习dubbo+zookeeper时安装启动dubbo-admin出现的一些问题: 首先我是跟着狂神安装zookeeper,基本下来没什么问题。然后就是安装dubbo-admin,狂神安装的是dubbo-admin-master,但是现在github上已经没有这个版本了,只能下载dubbo-admin-develop版本。接下来就是碰到的好多坑 用mvn clean pack

    2024年01月22日
    浏览(40)
  • 第一天 关于项目遇到的问题和缺少的知识点

    配置文件使用的都是配置类方式 创建配置类WebMvcConfig,设置静态资源映射 用于在Springboot项目中, 默认静态资源的存放目录为 : \\\"classpath:/resources/\\\", \\\"classpath:/static/\\\", \\\"classpath:/public/\\\" ; 而在我们的项目中静态资源存放在 backend, front 目录中, 那么这个时候要想访问到静态资源, 就需要

    2024年02月09日
    浏览(56)
  • 关于安装Node/Yarn/Electron过程中遇到的问题

    【参考文章】Node.js下载安装及环境配置教程 【问题描述】 使用 yarn create vite 命令安装项目依赖,报错如下: 【问题解决】 (1)在电脑的开始菜单中,搜索 PowerShell ,然后以 管理员身份运行 , (2)以管理员身份运行后,会出现命令窗口,接下来,输入命令 get-ExecutionPol

    2024年02月03日
    浏览(40)
  • 关于word加载mathtype我遇到的几种问题

    我用的是电脑自带的家庭版的2016版office,第一次用的一个mathtype的安装包忘记是哪个版本了,但是应该是7或者低于7的版本。遇到的问题是显示下面的窗口,这个问题我试了一晚上加一上午都没解决,正当我认命打算重装系统时我看到了一篇文章:(6条消息) word打开提示无法加

    2024年02月06日
    浏览(51)
  • 关于vue学习过程中遇到的大问题!!4/19

    近期不参加面试了:针对问题  就去解决问题。不要发现问题了,不去解决 就空焦虑 (1)针对vue相当于没有系统学过这件事:需要重新花时间补习 【最全最新Vue、Vuejs教程,从入门到精通】 https://www.bilibili.com/video/BV15741177Eh/?p=101share_source=copy_webvd_source=011d4ea3d9ec16c7445c65e3d8

    2023年04月19日
    浏览(33)
  • 关于配置tft液晶屏时,屏幕不显示遇到的问题

    本人新手小白,在使用单片机配置tft屏幕时,发现屏幕一直显示白屏(如下图)。但是仔细检查多遍后都无法找到问题所在,于是在CSDN上搜索了很久都没有发现类似问题的解决方法。无奈只能重新回到代码上寻找原因,终于功夫不负有心人让我找到了问题并成功解决。以下向

    2024年02月16日
    浏览(44)
  • 关于Kettle ETL java脚本编写遇到的一些问题记录

    使用方法**logBasic()**参数必须是字符串 这部分内容会在ETL的日志窗口显示 1.获取上个节点传输的数据 可以直接在左侧双击获取 2.全局参数获取 在启动运行的变量设置参数 在java代码中获取方式 3.获取当前节点参数 在当前窗口下方有个 参数 Tab页,在这里设置 在java代码中获取

    2024年02月12日
    浏览(41)
  • 关于openmv与stm32通信数据传输遇到的问题

      遇到smt32与openmv无法通信,或者数据对不上。 上面的是openmv端发给stm32端的数据 %c4 b‘  ’:是stm32打印接收到的数据  逐个排查: openmv与pc端串口助手正常发收。stm32与pc端也可以正常发,但是接收数据的时候不能正常接收。 利用LED灯debug。   确定问题出在stm32端的中断服

    2024年02月15日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包