下面是服务段和客户端的代码//server#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#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();}

解决方案 »

  1.   

    呜呜````我来晚了,没分,最近一直在研究这个,其实在你线程函数的while(true)前面,加上这句
    getpeername( cliSocket, (struct sockaddr FAR *)&cliaddr, &len ) ; //这句很重要,只有写了这个,才能正确的获取cliaddr的内容的,否则,不是0.0.0.0,就是204.204.204.204;
    应该就OK了,我就是抄你的,加了这句,就能看到127.0.0.1了,虽然完了,还是回答一下,免得以后的人,依然犯这个错误,
    我估计这个问题,是因为使用了多线程的原因,因为如果就在主线程里 监听,连接,发送,接受,是可以正常看到对方的IP的(127.0.0.1),
    所以多线程的时候,注意加那么一句,就OK了~