关于多线程WinSocket通信的问题,急!!!

Davis_Dai 2000-06-08 10:12: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();
但是,如果没有客户连接到服务器,在我的服务器退出时会出现断言错误,另外,当客户建立连接然后断开后不能恢复连接前的状态。请问上述方法有什么重大缺陷,应如何纠正?
谢谢
...全文
266 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
茂奇软件 2000-06-08
  • 打赏
  • 举报
回复
1.I dvice you use winsock2 but MFC winsock.
2. use select to analyze the active of sock
handle.
jansen zhu.
puzzle 2000-06-08
  • 打赏
  • 举报
回复
在辅助线程里添加死消息循环,把Accept放在里面或许可以解决第二个问题。
xielm 2000-06-08
  • 打赏
  • 举报
回复
Accept會阻塞等待接入,若沒有connect請求,不會執行下面的語句,所以你退出時,close了 一個沒有create的socket.
第二問題是,你的代碼順序執行完了,當然再也連不上。

總的解決方法是:
重載theSocket的OnAccept ,把 new pSocketRev 的工作放到其中
Kevin_qing 2000-06-08
  • 打赏
  • 举报
回复
upstair :than's the real answer!
can i have ur e-mail,then if I have an qn in future ,I can ask u for ur help

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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