如何用完成端口实现不阻塞的accept

heroboy2000 2005-01-18 01:20:52
我看windows网络编程上的示例accept是阻塞的
如何实现不阻塞的accept
能给出例子吗?
...全文
242 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tide2355 2005-01-19
  • 打赏
  • 举报
回复
完成端口的Accept阻塞是在等待新socket的连接上面,
如果你想在这上面少消耗点资源,在客户端仅仅进行少量的收发操作的情况下,可以考虑使用AcceptEx,
在重叠IO应用中,AcceptEx可以以异步方式工作。
runall 2005-01-18
  • 打赏
  • 举报
回复
弱弱的问什么是“完成端口”
heroboy2000 2005-01-18
  • 打赏
  • 举报
回复
请大家看清楚问题
我要求使用“完成端口”!!!
elssann 2005-01-18
  • 打赏
  • 举报
回复
AcceptEx
sharkhuang 2005-01-18
  • 打赏
  • 举报
回复
accept其实就是可读了,再accept就是非阻塞
hawlman 2005-01-18
  • 打赏
  • 举报
回复
消息映射方式WSAAsyncSelect
XmagicX 2005-01-18
  • 打赏
  • 举报
回复
listen
xuzheng318 2005-01-18
  • 打赏
  • 举报
回复
CListeningSocket *m_pSocket;//listening
CClientSocket *pSocket;//for accept client
if(m_pSocket->Accept(*pSocket))
{
pSocket->Initialize();
pSocket->AddTail(pSocket);
}
else //delete;
ancienttale 2005-01-18
  • 打赏
  • 举报
回复
m_sock是先侦听好的端口,你可以对这个端口select,如果有连接过来会在fdread上select到
ancienttale 2005-01-18
  • 打赏
  • 举报
回复
#ifdef UNIX
inline int TSOCK_select( SOCKET sock, DWORD nsec, BOOL bread = TRUE )
{
time_t tbegin = time(0);
int iret;
while( 1 )
{
fd_set fd;
FD_ZERO(&fd);
FD_SET(sock,&fd);
timeval t = { nsec, 0 };
timeval *pt = (nsec >= SOCK_INFINITE)? NULL : &t;
if( bread )
iret = select( sock+1 ,&fd, NULL, NULL, pt);
else
iret = select( sock+1 ,NULL, &fd, NULL, pt);
if( iret == SOCKET_ERROR && errno == EINTR )
{
DWORD nsecpassed = time(0) - tbegin;
if( nsecpassed >= nsec )
return 0;
else
{
nsec -= nsecpassed;
continue;
}
}
else
{
break;
}
}
return iret;
}
#else
inline int TSOCK_select( SOCKET sock, DWORD nsec, BOOL bread = TRUE )
{
fd_set fd;
FD_ZERO(&fd);
FD_SET(sock,&fd);
timeval t = { nsec, 0 };
timeval *pt = (nsec >= SOCK_INFINITE)? NULL : &t;
if( bread )
return select( sock+1 ,&fd, NULL, NULL, pt);
else
return select( sock+1 ,NULL, &fd, NULL, pt);
}
#endif



TCPSocket* Accept()
{
sockaddr_in addr;
memset(&addr,0,sizeof(addr));
SOCK_NAME_LEN_TYPE len;
len = sizeof(addr);
m_bOperateTimeOut = FALSE;

int iret = TSOCK_select(m_sock,m_torecv);
if(iret == 0)
{
m_bOperateTimeOut = TRUE;
return NULL;
}
if(iret < 0)
{
m_errcode = WSAGetLastError();
return NULL;
}

SOCKET sAcc = accept(m_sock,(sockaddr*)&addr,&len);
if(sAcc != INVALID_SOCKET)
{
TCPSocket* pSock = new TCPSocket(sAcc);
if(!pSock)
{
closesocket(sAcc);
return NULL;
}
else
{
pSock->SetTimeOut( m_torecv, m_tosend );
return pSock;
}
}
else
return NULL;
}

18,356

社区成员

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

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