C++ Windows非阻塞UDP通信源码

本文介绍了如何在Windows环境下,使用C++实现非阻塞的UDP通信。通过select函数实现在没有数据到达时,线程能执行其他任务,只有在有UDP数据时才进行接收,从而提高程序效率。
摘要由CSDN通过智能技术生成

UDP通信中,recvfrom或recv等函数默认都是阻塞方式进行的,即如果没有收到消息,那么程序会一直卡在recv()这个函数这里,使得该线程不能进行后续的操作。但有时候我们需要该线程在有UDP数据发送过来的时候才进行数据接收,而在其他时间该线程还有别的任务进行处理,那么我们就需要将Sokcet设置为非阻塞通信的方式。

非阻塞通信中,需要用到select()函数,select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型:

int select(int maxfdp, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout);

其中:

  • maxfd没有太大意义,一般是给赋值为最大描述符个数+1,只是起到兼容作用,大多数情况下会被系统忽略;
  • struct fd_set可以理解为一个集合,这个集合中存放的是文件描述符(file descriptor),即文件句柄,这可以是我们所说的普通意义的文件,当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫 无疑问一个socket就是一个文件,socket句柄就是一个文件描述符。fd_set集合可以通过一些宏由人为来操作,比如清空集合 FD_ZERO(fd_set * ),将一个给定的文件描述符加入集合之中FD_SET(int ,fd_set * ),将一个给定的文件描述符从集合中删除FD_CLR(int ,fd_set* ),检查集合中指定的文件描述符是否可以读写FD_ISSET(int ,fd_set* )。
  • 在select函数中,三个fd_set分别用于检查该文件句柄是否可读/是否可写/是否有文件错误异常。返回值大于0表示可操作,返回值等于0表示超时,返回值小于0表示有错误异常
  • struct timeval是一个大家常用的结构,用来代表时间值,有两个成员,一个是秒数,另一个是毫秒数。

下面给出一个非阻塞UDP通信的实例:

#include <WinSock2.h>
#pragma comment(lib, "WS2_32")
#include <Windows.h>
#include <iostream>
#include <string>

#define Port 5500
#define CACHE_LENGTH 1024
using
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值