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