您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> VC/MFC >> 在多线程中用CSocket::connect连接的问题

在多线程中用CSocket::connect连接的问题

来源:网络整理     时间:2016/8/16 13:08:35     关键词:

关于网友提出的“ 在多线程中用CSocket::connect连接的问题”问题疑问,本网通过在网上对“ 在多线程中用CSocket::connect连接的问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 在多线程中用CSocket::connect连接的问题
描述:

定义一个结构体,传给多线程函数,
struct SockStr
{
    CString cs_ip;
    CClientSocket *Clientsock;//CSocket派生类
};
我在一个对话框中加一个按扭
void CUserDlg::OnButtonOn() 
{
// TODO: Add your control notification handler code here
UpdateData();
BYTE b1,b2,b3,b4;
CString str_ip;
m_ip.GetAddress(b1,b2,b3,b4);//m_ip为IP控件 
str_ip.Format("%d.%d.%d.%d",b1,b2,b3,b4);
   
SockStr *Strsock=new SockStr;
Strsock->Clientsock=m_sock;//CClientSocket *m_sock
Strsock->cs_ip=str_ip;
         HANDLE hand=CreateThread(NULL,0,ThreadRecv,(LPVOID)Strsock,0,NULL);
CloseHandle(hand);
}
多线程函数:
DWORD WINAPI CUserDlg::ThreadRecv(LPVOID lpSockStr)
{
SockStr *Strsock=(SockStr*)lpSockStr;
         AfxMessageBox(Strsock->cs_ip);
if(!Strsock->Clientsock->Connect(Strsock->cs_ip,9999))
{
   AfxMessageBox("连接服务器失败!!!");
   Strsock->Clientsock->Close();
   if(!Strsock->Clientsock->Create())
   {
       AfxMessageBox("网络创建错误!!!");
       Strsock->Clientsock->Close();
   }
   return 0;
        }
       AfxMessageBox("1");
      return 0;
}
服务器的Socket也用的是CSocket派生的,当我按一下按扭的时候,线程运行,调用AfxMessageBox(Strsock->cs_ip);弹出IP的对话框,后面就没有反映了,没有调用AfxMessageBox("连接服务器失败!!!");也没有调用AfxMessageBox("1");也就是这个线程一直在connect,为什么会这样?
按第二下的时候就调用了AfxMessageBox("连接服务器失败!!!"),且程序出错退出。我想应该是因为第一个线程一直在connect没结束的原因。但是当我不用多线程处理,就在OnButtonOn中connect时就没问题,这个聊天程序已经做好了的,只是想用多线程处理就不会出现连接时程序就不动的情况(当连外网和无线网就会出现连接时卡住程序的情况),然后就出现了connect的问题,请高手帮忙看看是什么问题?谢谢! 我试过IP写错也是这样的情况,也就是运行到connect就停止了,没有往下运行,线程也没结束。会不会是因为在多线程中不能独自处理connect,要连Create一起使用?但这没有理由,在主程序中创建Socket,用一个线程来连接,应该不会有问题,可出了这个问题不知道是什么原因,请高手帮忙看下!非常感谢!!


解决方案1:

怎么这么多人都喜欢用CSocket,仅仅是因为它做了封装????

解决方案2:

因为Csocket的connect是发消息给绑定的窗口,触发onconnect,多线程之后就触发不了了,你去MSDN看CSOCKET的父类的attach和detach等函数
这个listen不需要触发事件,所以可以成功

解决方案3:

CSocket对多线程支持的不好,因为存在注册窗口的问题,需要attach,detach等处理,很麻烦
如果用多线程最好使用winsock之类的去写


以上介绍了“ 在多线程中用CSocket::connect连接的问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3328150.html

相关图片

相关文章