socket的tcp连接的server获得的客户端的ip是错的

socket的tcp连接的server取得的客户端的ip是错的。
下面是服务段和客户端的代码

//server
C/C++ code

#include "winsock2.h"
#include "stdio.h"
#include <assert.h>

DWORD  WINAPI  AnswerThread(LPVOID  lparam)  
{ 
    
    SOCKET  cliSocket = (SOCKET)(LPVOID)lparam;     
    SOCKADDR_IN  cliaddr;
    char clibuf[100];
    int len=sizeof(SOCKADDR);

    while (true)
    {
        int nRevLength = 0;
        if (-1 !=  (nRevLength = recvfrom(cliSocket,clibuf,100,0,(SOCKADDR*)&cliaddr,&len)))
        {
            printf("Good: Receive Length = %d \n", nRevLength);
            printf("对方IP:%s\n",inet_ntoa(cliaddr.sin_addr));//问题从这可以看出来。
            printf("%s\n\n",clibuf);       
        }
        else
        {
            printf("Error: Receive Length = %d \nReceive thread will quit.\n", nRevLength);
            break;
        }
        
        Sleep(100);
    }        

    closesocket(cliSocket);
    return  0;  
} 

void main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    
    //构建保存版本号的WORD类型变量
    wVersionRequested = MAKEWORD( 1, 1 );
    
    //加载套接字库
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) 
    {
        return;
    }
    
    //检查加载的套接字库版本和请求的是否一致
    if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) 
    {
        WSACleanup( );
        return; 
    }
    
    //创建套接字,第一个参数是地址族 TCP/IP下始终为AF_INET,第二个参数表示流式套接字,第三个参数指定协议,0表示系统自选协议 而对于流式套接字 系统的自选协议就是TCP协议
    SOCKET socksev=socket(AF_INET,SOCK_STREAM,NULL);
    
    //定义地址结构体 并初始
    SOCKADDR_IN sevaddr;
    sevaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    sevaddr.sin_family=AF_INET;
    sevaddr.sin_port=htons(41010);
    
    bind(socksev,(SOCKADDR*)&sevaddr,sizeof(SOCKADDR));
    int nListen = listen(socksev, SOMAXCONN);
    if(nListen   ==   SOCKET_ERROR)  
    {
        assert(false);
    }
    
    while(1)
    {
        SOCKET   newsocket;     
        struct   sockaddr_in   clientaddr;     
        int   length;     
        length   =   sizeof(struct   sockaddr_in);
        newsocket   =   accept(socksev, (struct   sockaddr   FAR   *)&clientaddr,   &length);

        if(newsocket   ==   INVALID_SOCKET)   
        {   
            printf("accept   fail   !"); 
        }
        else
        {
            printf("accept true, start a receive thread.\n");
            CreateThread(NULL,NULL, AnswerThread,(LPVOID)newsocket, 0, 0); 
        }
    }
    closesocket(socksev);
    WSACleanup();
}


//client
C/C++ code

#include "winsock2.h"
#include "stdio.h"

void main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    
    wVersionRequested = MAKEWORD( 1, 1 );
    
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) 
    {
        return;
    }
    if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) 
    {
        WSACleanup( );
        return; 
    }

    SOCKET sockcli=socket(AF_INET,SOCK_STREAM,NULL);

    char ip[20];
    printf("输入对方IP:");
    scanf("%s",ip);
    
    SOCKADDR_IN addrsvr;
    addrsvr.sin_addr.S_un.S_addr=inet_addr(ip);
    addrsvr.sin_family=AF_INET;
    addrsvr.sin_port=htons(41010);


    char clibuf[100];

    if(connect(sockcli, (const sockaddr*)&addrsvr, sizeof(sockaddr)) != 0)
    {
        printf("connect error\n");
    }

    while(1)
    {       
        memset(clibuf,0,100);
        printf("对方IP:%s\n",ip);
        scanf("%s",clibuf);
        printf("\n");
        sendto(sockcli,clibuf,100,0,(SOCKADDR*)&addrsvr,sizeof(SOCKADDR));        
    }

    closesocket(sockcli);
    WSACleanup();

}




------解决方案--------------------