网络传输上的问题,我有一个结构,里面有一个指针,也就是一个链表,指向下一条记录,但我现在将此链表通过网络传输以后,里面的指针指向了非法的地址,导致服务器端出错,请问,该如果解决...代码示意如下:struct _tagPackage
{
        int  mSize;
        TCHAR szData;
     _tagPackage *pNext;
}PACKAGE,*PPACKAGE;服务器端2条记录PACKAGE  mPack[2];
mPack[0].mSize = 0
mPack[0].szData = TEXT("0");
mPack[0].pNext = &mPack[1];mPack[1]........
mPack[1].pNext = NULL;客户端将此结构传输到服务器端之后,mPack[0].pNext指向的将会是一个非法的地址,请问我如何解决这个问题~~~

解决方案 »

  1.   

    地址怎么能这样传递呢?你应该在接收方重新申请空间的时候,重新设置pNext的值
      

  2.   

    指针不能跨进程传递(除非使用COM机制),更不要说是跨机器了。传递数据的时候需要修改一下,不要用现在的结构,可以使用下面的这种结构:
    struct _tagTransferPackage
    {
            int  mSize;
            TCHAR szData;
    }TRANSFERPACKAGE,*PTRANSFERPACKAGE;
    根据链表结构生成一个TRANSFERPACKAGE结构的数组,然后在服务器端根据这个数组重构链表(如果服务器端非得要使用数组的话)
      

  3.   

    客户端将此结构传输服务器端到之后,mPack[0].pNext指向的将会是一个非法的地址肯定的了:因为mPack[0].pNext = &mPack[1];
    在服务器端九五意义了,看看你的接收代码,才知道如何解决。
      

  4.   

    此问题我已经解决了..谢谢各位..遇到一个新的问题..当一个传输线程结束以后,服务器程序出现CPU占用100%的情况,请问,我如何定位出错的位置~~代码如下.
    Listen过程如下..
    for(;;) //Better than while(true)
    {
    SOCKET newsocket;
    struct sockaddr_in clientAddress;
    int clientAddressLength;
    clientAddressLength = sizeof(clientAddress);
    newsocket = accept(listener,
    (struct sockaddr *)&clientAddress,
    &clientAddressLength);
    if(newsocket < 0)
    {
    LOGERR(LOGFILE,TEXT("Accept connect failed!Error Number:%i\n"),WSAGetLastError());
    WSACleanup();
    return EXIT_FAILURE;
    }
    LOGERR(LOGFILE,TEXT("Get a Connect from %s\n"),inet_ntoa(clientAddress.sin_addr));

    if(ThreadNumber < MAX_THREAD)//&Iuml;&szlig;&sup3;&Igrave;&Oacute;&ETH;&Oacute;à&Ocirc;ò&frac12;&Oacute;&frac12;&oslash;
    {
    /* &Aring;&auml;&Ouml;&Atilde;Node &frac12;á&sup1;&sup1; */
    Node *pKey = NULL;
    pKey = (Node*)malloc(sizeof(Node));
    pKey->sock = newsocket;
    memcpy(&pKey->ClientAddr,&clientAddress,clientAddressLength);
    /*&frac14;&Oacute;&Egrave;&euml;&micro;±&Ccedil;°&micro;&Auml;Socket&Aacute;&not;&frac12;&Oacute;&Aacute;&acute;±í*/
    AddHead(ghSocketList,pKey);
    /* &acute;&acute;&frac12;¨&Ograve;&raquo;&cedil;&ouml;&Iuml;&szlig;&sup3;&Igrave;&Oacute;&euml;Client&frac12;&raquo;&Igrave;&cedil; */
    HANDLE hThread;
    DWORD dwThreadId;
    hThread = CreateThread(NULL,0,ThreadFunc,(LPVOID)pKey,0,&dwThreadId);
    CloseHandle(hThread);
    EnterCriticalSection(&gCriticalSection);
    ThreadNumber++;
    LeaveCriticalSection(&gCriticalSection);
    }
    else//·&ntilde;&Ocirc;ò·&cent;&Euml;&Iacute;&Ntilde;&para;&Iuml;&cent;&frac34;&Uuml;&frac34;&oslash;
    {
    TCHAR szMessage[9];
    CreateMessageCommand(szMessage,9,SEND_REJECT);
    int rc = send(newsocket,szMessage,strlen(szMessage),0);
    if(rc==SOCKET_ERROR)
    LOGERR(LOGFILE,TEXT("Send reject message failed! Error number: %i\n"),WSAGetLastError());
    shutdown(newsocket,SD_BOTH);
    closesocket(newsocket);
    }
    Sleep(3000);
    }
    LOGERR(LOGFILE,TEXT("Process Terminate\n"));
    return 1;
    }我觉得这个循环不应该出现问题,我Debug发现,当一个传输过程结束以后,则Server出现CPU占用100%的问题~~不知道为何..
      

  5.   

    建议你逐句看下代码,肯定出现死循环了,否则不会出现CPU100%的情况
      

  6.   

    找到原因了...当客户端未经协商,就断开连接closesocket()服务器端,则Send不会出错,只是Rc返回值为零..靠~~因为我使用了如下这段代码发送int temp = ..//需要发送的字节数
    int rc = 0while(temp>0)
    {
         rc = send(.....)
         if(rc == SOCKET_ERROR)//Error handle
         {...}
         temp -= rc;
    }
    所以导致了一个死循环,但是奇怪的是,对方关闭连接,应该send出错,才是比较合理的.
      

  7.   

    怎么还有sleep(3000)呢?万一这个时候有传入的连接怎么办?