socket的tcp连接的server获得的客户端的ip是错的
socket的tcp连接的server取得的客户端的ip是错的。
下面是服务段和客户端的代码
//server
//client
------解决方案--------------------
下面是服务段和客户端的代码
//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(); }
------解决方案--------------------