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

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,使用新创建的发送数据。
但是启动第二个客户端的时候,收不到数据,这段程序又问题么?
...全文
188 5 点赞 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
这种使用多线程的方式问题不大,但是如楼上所说,代码中有些问题要再斟酌。
  • 打赏
  • 举报
回复
zhangyihu321 2013-02-01
建议 线程不要和对话框耦合太大 否则很难修改啊
  • 打赏
  • 举报
回复
YunXia98Li 2013-02-01
看你的例子很简单,不需要多线程吧,用select或WSAAsynSelect都可以,拿这的socket例子参考一下: http://download.csdn.net/detail/geoff08zhang/4571358
  • 打赏
  • 举报
回复
相关推荐
发帖
网络编程
加入

1.8w+

社区成员

VC/MFC 网络编程
申请成为版主
帖子事件
创建了帖子
2013-02-01 04:27
社区公告
暂无公告