请教accept()超时如何设置
做了一个服务器段的程序,想将accept()放到while(){}中,循环监听客户端的服务请求,
但是不处理的话,服务器端运行到accept(),如果没有客户端连接的话,就阻塞了,不太好
所以请教大家,accept()的超时是如何设置的。
谢谢!
做了一个服务器段的程序,想将accept()放到while(){}中,循环监听客户端的服务请求,
但是不处理的话,服务器端运行到accept(),如果没有客户端连接的话,就阻塞了,不太好
所以请教大家,accept()的超时是如何设置的。
谢谢!
解决方案 »
- socket的问题
- 如何CDC中取得的path(GetPath)进行缩放?
- UpdateRegistryAll报错
- 请问将一个指针转换为void*的指针该用哪种C++类型转换符?
- 跪求一个简单计算器
- Windows Object是怎么销毁的?
- DirectDraw初始话问题
- 50问一个基本问题:pBroadDocTemplate->OpenDocumentFile(NULL);在98下可以,但是在2000下的debug却出错,不知何故?
- 关于文件源代码??
- 读取一个文本文件并把文件中的文本保存在一个CString对象中,如何能做到。
- 大侠们请问 clist box控件与 clist ctrl控件有什么区别
- 请教静态链接与动态链接以及debug和release版本的区别?
我是想accpet()一个客户端请求,就在服务器端创建一个线程去处理,
但如果长时间没有连接请求的话,服务器段不就阻塞在accept()这了,
我是想在长时间没有请求的情况下对服务器做其他处理,比如停掉服务器之类的。
recv,send不就有超时设置的办法吗,所以请教一下accept()如何设置,
accept()超时了就方便我下一步做其他的处理。
我之前对recv和send
用setsockopt()设了超时,
不好意思,初学者
unit32 SocketWait(TSocket* s, bool rd, bool wr, unit32 timems)
{
fd_set rfds, wfds;
#ifdef _WIN32
TIMEVAL tv;
#else
struct timeval tv;
#endif /*_WIN32*/
FD_ZERO(&rfds);
FD_ZERO(&wfds);
if(rd) //TRUE
FD_SET(*s, &rfds); //添加要测试的描述字
if(wr)
FD_SET(*s, &wfds);
tv.tv_sec = timems/1000; //seconds
tv.tv_usec = timems%1000; //ms
for(;;) //如果errno==EINTR,反复测试缓冲区的可读性
switch(select((*s)+1, &fds, &wfds, NULL, (timems==TIME_INFINITE?NULL:&tv))) //测试在规定的时间内套接字接口接收缓冲区是否有数据可读
{
// 0——超时, -1——出错
case 0: /*time out*/
return 0;
case (-1): /*socket error*/
if( SocketError()==EINTR )
break;
return 0; //有错但不是EINTR
default:
if(FD_ISSET(*s, &rfds)) //如果s是fds中的一员返回非0,否则返回0
return 1;
if(FD_ISSET(*s, &wfds))
rerun 2;
return 0;
};
}
select模型是这样的我记得是5个参数
第一是句柄,最后一个是时间,当中忘记了
你可以根据select返回的值来判断是否有数据在你的端口上面,如果有数据则RECV如果没有超过时间则返回其他值,你就可以做你想做的事情了。
while (cntrFlag)
{ communicateSock = accept(srvSock, (struct sockaddr*)&socketAddr, &len);//listen the application of connecting」ャcreate and return a new Socket,我想在这里做accept超时的处理 if (INVALID_SOCKET == communicateSock)
{
printf("Accept error!ERROR:%d\n", WSAGetLastError());
continue;
}
printf("Serve application from %s(at port %d)\n", inet_ntoa(socketAddr.sin_addr),socketAddr.sin_port);
hThread = CreateThread(NULL,//structure pointer to point SECURITY_ATTRIBUTES
NULL,//initial thread stack size
ThreadProc,//the thread entry function,recv,send都在ThreadProc里做 (LPVOID)&communicateSock,//thread parameters passed
0,//set additional ers used to control the thread
&dwThreadId);//thread ID
if (hThread == NULL)
{
closesocket(communicateSock);
printf("ERROR in serving %s\n", inet_ntoa(socketAddr.sin_addr));
continue;
}
CloseHandle(hThread);
}
{ communicateSock = accept(srvSock, (struct sockaddr*)&socketAddr, &len);//listen the application of connecting」ャcreate and return a new Socket
if (INVALID_SOCKET == communicateSock)
{
printf("Accept error!ERROR:%d\n", WSAGetLastError());
continue;
}
printf("Serve application from %s(at port %d)\n", inet_ntoa(socketAddr.sin_addr),socketAddr.sin_port);
hThread = CreateThread(NULL,//structure pointer to point SECURITY_ATTRIBUTES
NULL,//initial thread stack size
ThreadProc,//the thread entry function
(LPVOID)&communicateSock,//thread parameters passed
0,//set additional ers used to control the thread
&dwThreadId);//thread ID
if (hThread == NULL)
{
closesocket(communicateSock);
printf("ERROR in serving %s\n", inet_ntoa(socketAddr.sin_addr));
continue;
}
CloseHandle(hThread);
}我想在这里做accept()后,如果长时间没有连接请求时,做超时的处理
recv,send都放在了ThreadProc里创建线程去做了