这样写可以实现服务端多线程么?

tmac_roy 2013-02-01 04:27:45
UINT SendDataThread(LPVOID lpParam)
{
CVSMNETDlg* dlg=(CVSMNETDlg*)lpParam;
SOCKET sock;
struct sockaddr_in servaddr;
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(4040);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
struct sockaddr_in clientaddr;
int lenth=sizeof(clientaddr);
int result;
sock=socket(AF_INET,SOCK_STREAM,0);
result = bind(sock, (struct sockaddr *) &servaddr, sizeof(servaddr));
if (result == SOCKET_ERROR) /* 绑定失败 */
{
closesocket(sock);
AfxMessageBox("绑定失败");
}
result = listen(sock, SOMAXCONN);
while(1)
{
dlg->ImageSock=accept(sock,(struct sockaddr*)&clientaddr,&lenth);
AfxBeginThread(SendData,dlg);
}
closesocket(sock);
return 0;
}

ImageSock是成员变量,在子线程里面,我又创建了一个SOCKET=ImageSock,使用新创建的发送数据。
但是启动第二个客户端的时候,收不到数据,这段程序又问题么?
...全文
212 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tmac_roy 2013-02-03
  • 打赏
  • 举报
回复
引用 2 楼 zhangyihu321 的回复:
建议 线程不要和对话框耦合太大 否则很难修改啊
那我把线程用到变量改成全局的,这样应该可以吧
stjay 2013-02-02
  • 打赏
  • 举报
回复
想想就知道了 多个客户端用同一个dlg->ImageSock会有什么问题? 就是只能保存最后一个连接上来的客户端 可以改成
    while(1)
    {
        SOCKET ImageSock=accept(sock,(struct sockaddr*)&clientaddr,&lenth);
        AfxBeginThread(SendData,ImageSock);
    }
或者用数组和链表来保存客户端socket
Squall_zy 2013-02-02
  • 打赏
  • 举报
回复
这种使用多线程的方式问题不大,但是如楼上所说,代码中有些问题要再斟酌。
  • 打赏
  • 举报
回复
建议 线程不要和对话框耦合太大 否则很难修改啊
YunXia98Li 2013-02-01
  • 打赏
  • 举报
回复
看你的例子很简单,不需要多线程吧,用select或WSAAsynSelect都可以,拿这的socket例子参考一下: http://download.csdn.net/detail/geoff08zhang/4571358

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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