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