UpdateData(TRUE);
int ClientNum;
ClientNum=m_count;
CSocket Server;
CSocket so;
Server.Create(5050);
while(ClientNum)
{
Server.Listen();
if(Server.Accept(so))
{
CString ip;
UINT nPort;
so.GetPeerName(ip,nPort);

CString port;
port.Format("%d",nPort);
m_ip.AddString(ip+":"+port);

CString idnum;
idnum.Format("%d",ClientNum);
sendmes.socket=&so;
sendmes.ip=ip;
sendmes.hello="hello! welcome to you"+idnum; AfxBeginThread(SendData,(LPVOID)&sendmes);
UpdateData(FALSE);
ClientNum--;
}
}
AfxEndThread(0);
Server.Close();
//线程函数
UINT SendData(LPVOID p)
{
p->socket.Send(p->hello,50,0);
}

解决方案 »

  1.   

    sendmes是什么类型的?
    需要在线程函数内部强制转换回来。
      

  2.   

    应该要转换吧
    UINT SendData(LPVOID p)
    {
       sendmes* sd = (sendmes*) p;   sd->socket.Send(p->hello,50,0);
    }
      

  3.   

    为何ClientNum是1时候,线程不执行线程函数,而是为0时候执行???
      

  4.   

    类型转换在线程中强制类型转换 <reinterpret_cast>
      

  5.   

    CSocket不支持多线程,CSocket需要一个窗口接收消息,而这个窗口是与创建CSocket时的当前线程捆绑的,登记在一个线程数据块中,因此当在另一个线程调用时将找不到这个窗口,CSocket的消息无法处理。多线程要直接使用socket句柄。参见MFC中CSocket的源码