如何控制阻塞模式下socket通信的accept的等待时间?请帮忙修改程序,谢谢!

xqchang 2003-05-07 10:07:52
我的server端程序用sktConnect进行监听,用sktClient进行数据接收,阻塞模式。在下面的程序中,我想在调用accept时不要等待的时间太长,而是限时15秒,但一直不能正确运行。当客户端调用connect时,服务端运行到下面所示的select时,能等待15秒就运行下面的语句了,但返回的nRet值总是0,即超时错,不能建立连接。请问要实现我素要求的功能,程序该如何修改?谢谢!

//设置非阻塞方式连接
unsigned long ul=1;
nRet = ioctlsocket(sktConnect, FIONBIO, (unsigned long*)&ul);
if(nRet==SOCKET_ERROR){
AfxMessageBox("设置非阻塞方式错误");
return FALSE;
}

int ilenofsockaddr=sizeof(sockaddrin);
sktClient=accept(sktConnect,(struct sockaddr far *)&sockaddrin,&ilenofsockaddr);

struct timeval timeout;
fd_set r;
FD_ZERO(&r);
FD_SET(sktConnect, &r);
timeout.tv_sec = 15; //连接超时15秒
timeout.tv_usec=0;
nRet=select(0, 0, &r, 0, &timeout);
if(nRet<=0){
AfxMessageBox("设置连接超时错误");
return FALSE;
}

//再设回阻塞模式
unsigned long ul1=0;
nRet = ioctlsocket(sktConnect, FIONBIO, (unsigned long*)&ul1);
if(nRet==SOCKET_ERROR){
AfxMessageBox("设置阻塞模式错误");
return FALSE;
}
...全文
610 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jeffchen 2003-05-13
  • 打赏
  • 举报
回复
不会的。我就是这样用的。
CTCPConnection CTCPListener::Accept(DWORD dwTimeOut)
{
// Wait for the client connecting
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(m_hSocket,&readfds);

int nRetCode=0;
if(INFINITE==dwTimeOut)
nRetCode=select(0,&readfds,0,0,NULL);
else
{
struct timeval timeout;
timeout.tv_sec=0;
timeout.tv_usec=dwTimeOut*1000;

nRetCode=select(0,&readfds,0,0,&timeout);
}

if(nRetCode>0)
{
if(FD_ISSET(m_hSocket,&readfds))
{
// The client is connecting;
SOCKADDR_IN addr;
int nAddrLength=sizeof(addr);

SOCKET hSocket=accept(m_hSocket,(SOCKADDR*)&addr,&nAddrLength);
if(INVALID_SOCKET==hSocket)
throw CTCPException(WSAGetLastError(),"Cannot accept the client connection","CTCPListener::Accept");

return CTCPConnection(hSocket,addr);
}
else
throw CTCPException(WSAGetLastError(),"Accept() ocurr a error.","CTCPListener::Accept");
}
else
throw CTCPException(WSAGetLastError(),"Accept() is timeout","CTCPListener::Accept");
}
xqchang 2003-05-12
  • 打赏
  • 举报
回复
谢谢楼上朋友的回应!
我就是想要控制litsen的时间,要求在15秒之内若没有连接请求,就继续运行下面的语句,若有连接请求就接受处理。

to jeffchen(Jeff) :按照你的方法,select返回结果总是0,即超时错,接受不到连接请求。
jeffchen 2003-05-12
  • 打赏
  • 举报
回复
先调用select函数,再调用accept函数。因为监听用的socket,如果有客户端连接,select函数会返回;否则,就根据timeout进行等待。
alien75 2003-05-12
  • 打赏
  • 举报
回复
说错了,看是不是返回INVALID_SOCKET ,然后用WSAGetLastError()是不是WSAEWOULDBLOCK
alien75 2003-05-12
  • 打赏
  • 举报
回复
这是MSDN中的描述:
If the socket is marked nonblocking and no pending connections are present on the queue, accept returns an error as described below.

你将socket设置非阻塞,当没有连接存在时accept就会返回错误描述。你看一看是不是返回了WSAEWOULDBLOCK

xqchang 2003-05-09
  • 打赏
  • 举报
回复
up
xqchang 2003-05-08
  • 打赏
  • 举报
回复
谁知道啊????????
yydyqy 2003-05-08
  • 打赏
  • 举报
回复
将FD_SET(sktConnect, &r);改为

FD_SET(sktClient, &r);

试试
xqchang 2003-05-08
  • 打赏
  • 举报
回复
谢谢yydyqy的回应,你说的方法我已经试过了,确实可以与客户端正确建立连接了,但又一个问题出现了,就是在select时,若没有接收到客户端的请求,它应该等待15秒的,现在却不等待了,直接就运行下面的语句了。请问我该如何让服务端等待15秒时间,以便客户端继续进行connect请求呢?
  谢谢!!!!!!!!!
xqchang 2003-05-07
  • 打赏
  • 举报
回复
呵呵,大家帮忙了。。。。。。。。。。。。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧