SO_SNDTIMEO 选项值类型获取/设置Wi n s o c k版本说明 整数两者均可1 + 获取或设置套接字上的数据发送超时时间(以毫秒为单位) S O _ S N D T I M E O选项用于在一个锁定套接字上调用Wi n s o c k发送函数时,设定一个“超时” 值。这是一个以毫秒为单位的整数值,设定发送函数最多执行多久。假如需要使用 S O _ S N D T I M E O选项,并用W S A S o c k e t函数创建套接字,那么必须将W S A _ F L A G _ O V E R L A P P E D 设为W S A S o c k e t的d w F l a g s参数的一部分。以后对任何Wi n s o c k发送函数的调用(s e n d、s e n d t o、 W S A S e n d、W S A S e n d To等等)都只会锁定指定数量的时间。如发送操作在那段时间内不能完 成,调用便会失败,并返回错误1 0 0 6 0(W S A E T I M E D O U T)。
SOCKET cClient;
int ret;
struct sockaddr_in server;
hostent *host=NULL;if(WSAStartup(MAKEWORD(2,0),&wsd))
{
return 0;
}
cClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(cClient==INVALID_SOCKET)
{
return 0;
}
//set Recv and Send time out
int TimeOut=6000; //设置发送超时6秒
if(::setsockopt(cClient,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
{
return 0;
}
TimeOut=6000;//设置接收超时6秒
if(::setsockopt(cClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
{
return 0;
}
//设置非阻塞方式连接
unsigned long ul = 1;
ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul);
if(ret==SOCKET_ERROR)return 0;//连接
server.sin_family = AF_INET;
server.sin_port = htons(25);
server.sin_addr.s_addr = inet_addr((LPCSTR)pSmtp);
if(server.sin_addr.s_addr == INADDR_NONE)
{
return 0;
}connect(cClient,(const struct sockaddr *)&server,sizeof(server));//select 模型,即设置超时
struct timeval timeout ;
fd_set r;FD_ZERO(&r);
FD_SET(cClient, &r);
timeout.tv_sec = 15; //连接超时15秒
timeout.tv_usec = 0;
ret = select(0, 0, &r, 0, &timeout);
if ( ret <= 0 )
{
::closesocket(cClient);
return 0;
}
//一般非锁定模式套接比较难控制,可以根据实际情况考虑 再设回阻塞模式
unsigned long ul1= 0 ;
ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul1);
if(ret==SOCKET_ERROR)
{
::closesocket (cClient);
return 0;
}
//faq上也有的
if(setsockopt( hSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&TimeOut, sizeof(int)))
{
AfxMessageBox( _T("Set Timeout Error!"));
}
这个没问题啊.
选项值类型获取/设置Wi n s o c k版本说明
整数两者均可1 + 获取或设置套接字上的数据发送超时时间(以毫秒为单位)
S O _ S N D T I M E O选项用于在一个锁定套接字上调用Wi n s o c k发送函数时,设定一个“超时”
值。这是一个以毫秒为单位的整数值,设定发送函数最多执行多久。假如需要使用
S O _ S N D T I M E O选项,并用W S A S o c k e t函数创建套接字,那么必须将W S A _ F L A G _ O V E R L A P P E D
设为W S A S o c k e t的d w F l a g s参数的一部分。以后对任何Wi n s o c k发送函数的调用(s e n d、s e n d t o、
W S A S e n d、W S A S e n d To等等)都只会锁定指定数量的时间。如发送操作在那段时间内不能完
成,调用便会失败,并返回错误1 0 0 6 0(W S A E T I M E D O U T)。
VOID CMyUDP::SetTimeOut(DWORD deTime)
{
DWORD optval;
if(deTime)
{
optval=0;
ioctlsocket(m_sock,FIONBIO,(DWORD*)&optval);
if(INFINITE==deTime)
optval=0;
else
optval=deTime; setsockopt(m_sock,SOL_SOCKET, SO_RCVTIMEO, (char *)&optval, sizeof(int));
DWORD error=GetLastError();
}
else
{
optval=1;
ioctlsocket(m_sock,FIONBIO,(DWORD*)&optval);
}
}