每个socket在创建成功之后都有一个fd,原先以为只要把主线程的fd传递给子线程就没问题,CSocket的fd其实就一个int m_hSocket,可后来发现fd传进来的,也对了,但在子线程中send()和recv()有问题,所以这样还是不行的.
后来才发现,在次线程中不能直接操作主线程的 CSocket对象,要在子线程起来前把主线程的handle传递给子线程,在次线程使用一个CSocket类来接收这个Handle,这样在次线程中就可以方便地使用CSocket类了,.必须注意的是:传递handle需要使用Detach函数,接收handle 要使用Attach函数,具体代码如下:
SOCKET hHandle ;
hHandle = socket.Detach();
::AfxBeginThread(RecvRingMsgThread,(LPVOID)hHandle);
然后在子线程里面用:
CSocket s;
s.Attach((SOCKET)lparam);
接收,这样就基本可以实现,但不知道会有什么错误,听说只能用debug版本,还没验证.