有关UDP非阻塞recvfrom超时设置的问题

lingducool lingducool 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我现在想编这么一个程序,向目标端口发送UDP的一个包后,用recvfrom等待接受回应,等待5秒后未接到回应就继续向下执行。
我的思路是设置为非阻塞式套接字,然后设置超时5秒,但是这样我没有成功,代码如下:
#include <winsock2.h>
#include <iostream.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
void initClient();
int main()
{
initClient();
return 0;
}
void initClient()
{
WSADATA wsaData;
int error=WSAStartup(MAKEWORD(2,2),&wsaData);
if(error!=0)
{
cout<<"初始化DLL失败"<<endl;
return;
}
if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
cout<<"版本出错"<<endl;
return;
}
SOCKET s=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN sockSend;
sockSend.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
sockSend.sin_port=htons(4000);
sockSend.sin_family=AF_INET;
char buff[1024];
strcpy(buff,"hello,it's the first!");


int iMode = 1;//block
ioctlsocket(s, FIONBIO, (u_long FAR*) &iMode);
DWORD TimeOut=1000*5; //设置发送超时10秒
if(::setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
{
cout<<"设置失败"<<endl;
}

int lenword;
lenword=sendto(s,buff,strlen(buff)+1,0,(sockaddr *)&sockSend,sizeof(sockaddr));
cout<<lenword<<","<<sockSend.sin_port<<":"<<sockSend.sin_addr.S_un.S_addr<<endl;




char recBuff[1024];
memset(recBuff,0,1024);
SOCKADDR_IN sockRec;
int len=sizeof(SOCKADDR);

recvfrom(s,recBuff,sizeof(recBuff),0,(sockaddr *)&sockRec,&len);

printf("the receive is\n");

closesocket(s);
WSACleanup();
}


大家注意这句:int iMode = 1;不管我这一句是0还是1,都不会阻塞,程序执行后一下子就出现了打印的最后一句,根本不会等待5秒。我的这是windows平台的程序
...全文

相关推荐

在套接字中如何设置超时连接.rar

VC++6.0编写的程序,供参考学习网络程序的开发

fanxbl957

UNIX网络编程卷1:套接字联网API(第3版)

UNIX网络编程卷1:套接字联网API(第3版).pdf,85M。内容全面,动动小手,资源 到手

lvyafei123cs

Linux UDP socket 设置为的非阻塞模式与阻塞模式区别

主要介绍了Linux UDP socket 设置为的非阻塞模式与阻塞模式区别的相关资料,需要的朋友可以参考下

weixin_38634037

C++非阻塞式读取UDP,串口方式总结.txt

使用C++撰写,非阻塞是的读取UDP,串口方式。串口数据,UDP数据一般采用阻塞式的方式,很多时候,整个程序如果没有接收到新的数据,那么程序就会一直等待接收数据,造成程序等待接收数据的状态,blockingread,无法正常向下运行,直到接收到新的数据,这种阻塞式方式缺点是会造成资源浪费,为了避免阻塞式程序导致程序被堵住,不往下执行,一种方式:采用多线程的方式,另外一种方式采用非阻塞的方式。 对于程序功能单一的传感器接收解析程序,可以采用阻塞式的方式,但是对于实时性要求高的复杂功能程序,不能因为传感器没有新数据,而停止不前,于是可以考虑最多等待多长时间,如果没有数据后,程序也正常向下执行:

lixiaohui139

Linux系统调用-- recv/recvfrom 函数详解

从套接字上接收一个消息。对于recvfrom ,可同时应用于面向连接的和无连接的套接字。recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。 如果消息太大,无法完整存放在所提供的缓冲区,根据不同的套接字,多余的字节会丢弃。 假如套接字上没有消息可以读取,除了套接字已被设置为非阻塞模式,否则接收调用会等待消息的到来。

记得退出系统
评论 3
收藏 已收藏
分享
返回顶部
lingducool
通信技术 4,397 成员 28,909 内容