有关UDP非阻塞recvfrom超时设置的问题
我现在想编这么一个程序,向目标端口发送UDP的一个包后,用recvfrom等待接受回应,等待5秒后未接到回应就继续向下执行。
我的思路是设置为非阻塞式套接字,然后设置超时5秒,但是这样我没有成功,代码如下:
大家注意这句:int iMode = 1;不管我这一句是0还是1,都不会阻塞,程序执行后一下子就出现了打印的最后一句,根本不会等待5秒。我的这是windows平台的程序
我的思路是设置为非阻塞式套接字,然后设置超时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编写的程序,供参考学习网络程序的开发
UNIX网络编程卷1:套接字联网API(第3版)
UNIX网络编程卷1:套接字联网API(第3版).pdf,85M。内容全面,动动小手,资源 到手
Linux UDP socket 设置为的非阻塞模式与阻塞模式区别
主要介绍了Linux UDP socket 设置为的非阻塞模式与阻塞模式区别的相关资料,需要的朋友可以参考下
C++非阻塞式读取UDP,串口方式总结.txt
使用C++撰写,非阻塞是的读取UDP,串口方式。串口数据,UDP数据一般采用阻塞式的方式,很多时候,整个程序如果没有接收到新的数据,那么程序就会一直等待接收数据,造成程序等待接收数据的状态,blockingread,无法正常向下运行,直到接收到新的数据,这种阻塞式方式缺点是会造成资源浪费,为了避免阻塞式程序导致程序被堵住,不往下执行,一种方式:采用多线程的方式,另外一种方式采用非阻塞的方式。 对于程序功能单一的传感器接收解析程序,可以采用阻塞式的方式,但是对于实时性要求高的复杂功能程序,不能因为传感器没有新数据,而停止不前,于是可以考虑最多等待多长时间,如果没有数据后,程序也正常向下执行:
Linux系统调用-- recv/recvfrom 函数详解
从套接字上接收一个消息。对于recvfrom ,可同时应用于面向连接的和无连接的套接字。recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。 如果消息太大,无法完整存放在所提供的缓冲区,根据不同的套接字,多余的字节会丢弃。 假如套接字上没有消息可以读取,除了套接字已被设置为非阻塞模式,否则接收调用会等待消息的到来。


