//公有变量
CSocket ServerSocket;
CSocket ClientSocket;
//主程序
{
ServerSocket.Create(m_Port);//创建监听端口
ServerSocket.Listen(-1);
while(true)
{
ServerSocket.Accept(ClientSocket);
clientCount+=1;
SOCKET hSocket=NULL;
ClientSocket.FromHandle(hSocket); //获得句柄
if(ClientSocket !=NULL && clientCount<=Maxnum)//连接用户未超过限制
{
AfxBeginThread(Listened,(LPVOID)hSocket,THREAD_PRIORITY_NORMAL); //启动线程
}
else
{
....
}
}
线程:
UINT Listened (LPVOID pParam)
{
CSocket mysocket;
.......
return 0;
}我想把ClientSocket作为参数传递到线程里
或者使线程里的mysocket=ClientSocket应该怎么办??

解决方案 »

  1.   

    AfxBeginThread(Listened,(LPVOID)ClientSocket,THREAD_PRIORITY_NORMAL); //启动线程
    线程:
    UINT Listened (LPVOID pParam)
    {
    CSocket mysocket = (CSocket)pParam;
    .......
    return 0;
    }
      

  2.   

    AfxBeginThread(Listened,(LPVOID)ClientSocket,THREAD_PRIORITY_NORMAL); //启动线程
    error C2440: 'type cast' : cannot convert from 'class CSocket' to 'void *'
            No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
      

  3.   

    ServerSocket.Accept(ClientSocket);
    clientCount+=1;
    AfxMessageBox(sInfo);
    HANDLE  hSendThread = NULL;
    SOCKET hSocket;
    hSocket=ClientSocket.Detach();
    if(ClientSocket !=NULL && clientCount<=Maxnum)
    {
    if(hSendThread=AfxBeginThread(Listened,(LPVOID)hSocket))
    {
    CloseHandle (hSendThread);
    }
    }
    else
    {

    }
    ClientSocket.Close();

    }
    UINT Listened (LPVOID pParam)
    {
    SOCKET sock =(SOCKET)pParam;
    CSocket sockRecv;
    sockRecv.Attach(sock);
    .......
    return 0;
    }
      

  4.   

    AfxBeginThread(Listened,(LPVOID)&ClientSocket,THREAD_PRIORITY_NORMAL); //启
      

  5.   

    CSocket跨线程会有问题。用API吧。
      

  6.   

    就像lsgt() 说的,将CSocket指针传给其它操作是不安全的
    可以传递句柄,然后使用CSocket::FromHandle(不知道是不是也可以用CSocket::Attach)使用api是一个不错的选择,因为CSocket本身的实现是不很理想的,它是在CAsyncSocket
    的基础上实现的一个阻塞模式,好像是针对早期的16位windows开发的我想,如果对性能要求不高,可以使用CAsyncSocket,否则,就用socket api,
    包括重叠I/O等,也可以使用一些库,如ace
      

  7.   

    CSocket本身不是线程安全的(大多数MFC的类都不是),因为其涉及到一个HANDLE与T*之间映射的MAP(Attach,Deatch,FromHandle会用到),而此MAP一般是线程局部存储的。因此你应该先Deatch,然后传递SOCKET,在线程函数中再Attach.
      

  8.   

    方法一:
    AfxBeginThread(Listened,(LPVOID)ClientSocket,THREAD_PRIORITY_NORMAL); //启动线程
    线程:
    UINT Listened (LPVOID pParam)
    {
    CSocket mysocket = (CSocket)pParam;
    .......
    return 0;
    }
    方法二:
    你还可以通过定义一个全局变量,然后用临界点方法,实现参数传递!