在winsock中,我将如何阻止接受函数从另一个线程阻塞?

Posted

技术标签:

【中文标题】在winsock中,我将如何阻止接受函数从另一个线程阻塞?【英文标题】:in winsock, how would i stop a accept function from blocking from another thread? 【发布时间】:2012-04-14 06:40:51 【问题描述】:

所以这是我的情况。我正在与 winsock 合作,学习一些有关网络和协议开发的知识,但我陷入了僵局。我现在正在做一个在接受调用时阻塞的服务器,但在后台有另一个线程等待用户输入并处理用户输入。此用户输入用于发送、ping 和say 等命令,但现在我想要一个名为exit 的命令,它将关闭winsock,释放所有打开的连接,然后结束程序。问题是,这个接受线程仍然阻塞。

所以这里有问题。 1) 无论如何在调用 winsock 函数时阻止它,并且 2) 在非阻塞模式下是这样的:

while(m_continue)

      Sleep(1);
      tempsock = accept(m_listenSock, NULL, NULL);
      if(tempsock != INVALID_SOCKET)
      
            if(WSAGetLastError() == WSAEWOULDBLOCK)
                  continue;
            else 
                  return 1;
      
      break;

是多余的还是太无用了?

【问题讨论】:

【参考方案1】:

从用户命令线程,当您处理“退出”命令时,关闭m_listenSock 套接字。阻塞的accept() 调用将立即以INVALID_SOCKET 退出。

确保不要关闭m_listenSock 句柄两次。

【讨论】:

这在 Windows 7 上对我不起作用。closesocket() 和 accept() 调用线程都被阻塞了。 试试这个: 注意当发出诸如接受之类的阻塞 Winsock 调用时,Winsock 可能需要等待网络事件才能完成调用。在这种情况下,Winsock 会执行警报等待,该等待可能会被安排在同一线程上的异步过程调用 (APC) 中断。在 APC 内发出另一个阻塞 Winsock 调用,中断同一线程上正在进行的阻塞 Winsock 调用将导致未定义的行为,并且 Winsock 客户端绝不能尝试。

以上是关于在winsock中,我将如何阻止接受函数从另一个线程阻塞?的主要内容,如果未能解决你的问题,请参考以下文章

IOS - 如何以编程方式阻止从另一个应用程序打开一个应用程序?

C++ Winsock API如何在接受连接之前获取连接客户端IP?

如何从主(winsock)向服务器发送消息?

winsock 的 v8 发布模式链接器错误

用winsock发送位图

如何在 Winsock 中发送文件(http 方式)