//-----------------------------------------------------------------------------------------------
        sockRecvClient  = accept( sockServer, (sockaddr *)(&addrRecvClient), &addrlenClient );        hThread = (HANDLE)_beginthreadex(  NULL, 
                                           0,
                                           ClientThread,
                                           &sockRecvClient,
                                           0,
                                           &nThreadID );
//------------------
unsigned int WINAPI ClientThread(void* lpParam)
{
    //接受指定的客户端Socket
    SOCKET  sClient = (SOCKET)lpParam;
//-----------------------------------------------------------------------------------------------
在线程函数ClientThread中,无法争取获得SOCKET的值。
比如说: sockRecvClient = 6004, 地址是0x0012FDB8
lpParam这个指针的地址没有问题也是0x0012FDB8,该地址存的值也是 6004
但是sClient = (SOCKET)lpParam的结果是将 0x0012FDB8地址转化过来的。我试着这么写: 
SOCKET  sClient = (SOCKET)(*lpParam)
编译不过去"error C2100: 非法的间接寻址"

解决方案 »

  1.   

    SOCKET*  sClient = (SOCKET*)lpParam;
      

  2.   

    啊,解决了unsigned int WINAPI ClientThread(void* lpParam)
    {
        //接受指定的客户端Socket
        SOCKET* pTmp = (SOCKET*)lpParam;
        SOCKET  sClient = (SOCKET)(*pTmp);
      

  3.   

    你传递错了,你这样传递是很危险的
    你直接传递SOCKET就好了啊,最好不要传递指针
    指针是一个变量
    你这个变量要是在线程接收参数完毕之前已经销毁了
    那么你从这个指针地址取值就无效了
    你这里直接传递SOCKET值就可以了
    为什么呢?因为SOCKET其实就是一个整数,一个唯一的描述符
    在该SOCKET被close之前都是存活的,值都是有效滴!
    所以建议你的代码如下:
    hThread = (HANDLE)_beginthreadex(  NULL, 
                                               0,
                                               ClientThread,
                                               (void*)sockRecvClient,
                                               0,
                                               &nThreadID );unsigned int WINAPI ClientThread(void* lpParam)
    {
        //接受指定的客户端Socket
        SOCKET sock= (SOCKET)lpParam;
      

  4.   

    TO: hurryboylqs
    谢谢阿,用指针的话确实有这个问题,不过还好我在外面的控制中,那个传入的地址sockRecvClient变量
    不会销毁的,而且,进入到我的线程函数后,就马上把他的Socket值取了出来,所以,多个客户端连接的情
    况下,sockRecvClient的地址始终没有变,只是每次accept返回来的socket值不一样而已。不过,你说的确实对。除非我在外面使用malloc出来的内存,否则肯定危险。
    只是开始没有想到可以用 (void*)sockRecvClient这样来做。搞了半天,唉。PS:我刚才已经给结贴了,不能给你分数了,实在抱歉阿。