以下都以不要轮询为前题,并且,使用标准的socket函数,如果能回答,请麻烦给我一段示例的代码,或者有代码的地址。万分感谢!!!
1. 创建一个socket,在等待连接上来时,如何设置等待超时??2. connect对方时,如果连不上,马上就返回,不要等那么久的时间??
1. 创建一个socket,在等待连接上来时,如何设置等待超时??2. connect对方时,如果连不上,马上就返回,不要等那么久的时间??
解决方案 »
- MFC中如何enable edit label和disable edit label
- VC 6.0 编写的openGL程序,在WIN7运行很卡,XP很流畅!~
- C++的奇怪的高深的问题
- 怎么让我接收数据的线程正常返回,我用的是阻塞套接字,谢谢!
- 求教各位牛人IHTMLDocument2获取内嵌框架问题
- 父子窗口的问题,请教大家
- VC调试问题:不能查看变量的值
- 请问大家怎样用标准的C++创建一个非模态的对话框而不调用MFC
- 哪位大哥有电子邮件的源代码,我在网上下载的怎么都用不了,报告什么533 Server err,这是怎么回事?
- 用CryptoAPI进行数据加密
- 怎么样得到声音大小?
- 怎么在xp下面装vc..求救!
至于例子,MS版的<windows网络编程>上有PING.EXE的原代码,仔细看看
WSAEVENT EventArray[2];
WSAEVENT NewEvent;
WSANETWORKEVENTS NetworkEvents;NewEvent = WSACreateEvent();
WSAEventSelect(SockConnect, NewEvent, FD_CONNECT);
SockArray[0] = SockConnect;
EventArray[0] = NewEvent;
DWORD EventTotal = 1;
nIndex =WSAWaitForMultipleEvents( EventTotal,
EventArray,
FALSE,
WSA_INFINITE,/*将WSA_INFINITE 改为你想等待的时间*/
FALSE );
WSAEnumNetworkEvents( SocketArray[nIndex - WSA_WAIT_EVENT_0],
EventArray[nIndex - WSA_WAIT_EVENT_0],
&NetworkEvents );
if ( NetworkEvents.lNetworkEvents & FD_CONNECT )
{
if ( NetworkEvents.iErrorCode[FD_ACCEPT_BIT] != 0 )
{
//**********ERROR***********
RETURN ;
}
//*************DO WHAT YOU WANT***************}
if(::setsockopt(cClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
{
return 0;
}
int TimeOut=6000; //设置发送超时6秒
if(::setsockopt(cClient,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
{
return 0;
}
如果不行,我有一个想法,我能不能在主线程里创建一个socket,然后作为参数传给由主线程建立的一个子线程去accept,然后主线程WaitForSingleObject阻塞在那里,如果超时返回,那么认为子线程的socket没有被连接,那么close子线程的socket,让子线程自动死掉,然后主线程返回超时没有被连接的错误。如果没有超时,就使用被子线程accept进来的socket虽然这样比较笨,但希望有人能告诉我不用winsock2那些函数能使用的方式。。谢谢了。
用mfc就很容易
它有自己的触发机制,用客户连接就会调用OnAccept()函数
在该函数里accept你的客户端
accept也许是SO_RCVTIMEO超时,connect是SO_SNDTIMEO超时.
connect超时
send超时
recv超时
--------------------------------------------------------------
int iValue, iLen=sizeof(iValue);
iValue = ???;//超时值
setsockopt(m_sSock, SOL_SOCKET, SO_RCVTIMEO, (char *)(&iValue), iLen); //接收超时
setsockopt(m_sSock, SOL_SOCKET, SO_SNDTIMEO, (char *)(&iValue), iLen);//发送超时
---------------------------------------------------------------
除了通过用setsockopt设置socket选项,也可以用线程的方法,比如:
// 负责连接的线程,参数为socket
void connnectthread(socket s)
{
connect(s);
}
main()
{
//启动连接线程
h_thread = beginthread(connectthread);
// 可以根据返回值来判断是连接完成,还是超过指定的timeout
waitforsingleobject(h_thread, timeout);
}
---------------------------------------------------------------
设置目的地址不存在时的SOCKET connect 超时,请看下面的连接.
http://www.codeguru.com/internet/timeoutsocket.shtml