关于多线程WinSocket通信的问题

Davis_Dai 2000-06-08 10:16:00
在我的应用程序里,我希望通过建立一个新的线程监听套接字的状态并接受/发送数据,不影响同时进行的其他操作。实现的主要过程如下:
1、响应一个命令消息并开始一个新的线程并在新线程里建立套接字,代码如下:
void CGms4App::OnStartserver()
{
//Setup for Sockets
pMain=AfxBeginThread(MainServerProc,NULL);
}
UINT MainServerProc(LPVOID pParam)
{
theSocket.Create(39990);
theSocket.Listen();
CSocket* pSocketRev=new CSocket;
if(!theSocket.Accept(*pSocketRev))
AfxMessageBox("Sorry");
//接收数据过程
delete pSocketRev;
theSocket.Close();
return 0;
}
2、在应用程序的ExitInstance()函数中作如下处理:
//......
theSocket.Close();
if(pMain)
TerminateThread(pMain->m_hThread,0);
Sleep(1000);
return CWinApp::ExitInstance();
但是,如果没有客户连接到服务器,在我的服务器退出时会出现断言错误,另外,当客户建立连接然后断开后不能恢复连接前的状态。请问上述方法有什么重大缺陷,应如何纠正?
谢谢
...全文
224 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
HaoGeGe 2000-06-09
  • 打赏
  • 举报
回复
1.要在每一个线程中调用SOCKET初始化函数.
BOOL CJECThreadB::InitInstance()
{
// TODO: この位置にスレッド単位の初期化コードを追加してください。
AfxSocketInit();
m_pListeningSendSocket = new CListeningSendSocket(this);
long nPort = 700;
if (m_pListeningSendSocket->Create(nPort))
{
if (!m_pListeningSendSocket->Listen())
return FALSE;
}

return TRUE;
}
2.不可跨线程访问SOCKET对象.线程对于其他线程中SOCKET的处理,
只能通过发送线程间消息,通知该线程才可处理.
while(!PostThreadMessage(
g_pThreadUp->m_nThreadID ,WM_THREADA_CLOSESOCKET, 0,0))
Sleep(10);



4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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