CSocket如何停止收听

时间:2011-11-16 15:31:50

标签: c++ sockets mfc winsock

所以,我有一个CSocket在一个工作线程中监听,它会做一个阻塞接受,然后为每个新连接转动另一个线程(是的,我知道perfermance不是问题)。

一个人怎么会停止听? 你不能从另一个线程调用它,因为CSocket会抛出一个断言。

任何快速修复或者只是扔掉这个设计糟糕的包装纸?

1 个答案:

答案 0 :(得分:0)

来自MSDN:

  

如果您想在另一个线程中处理此连接,只需   将MFC对象传递给线程将无法正常工作。至   正确设置要在a中处理的连接的所有内容   不同的线程,需要以下步骤:

     
      
  1. 从接受连接的线程中的CAsyncSocket对象中分离套接字句柄。
  2.   
  3. 将套接字句柄传递给线程。
  4.   
  5. 在该线程中,将此句柄附加到CAsyncSocket派生对象。
  6.   

如果您要创建性能关键程序,我个人使用IOCP

代码看起来类似于:

Accept(ClientSocketObject, ... );
SOCKET s = ClientSocketObject.Detach();
CreateThread( ... ,(LPVOID)s, ...);

在你的线程程序中,

ThreadProc( SOCKET s ){
CAsyncSocket clientSocket;
clientSocket.Attach( s );