血源诅咒月光大剑滋养:请问在下面这段程序中,服务器如何得知客户机的IP地址?

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/28 06:22:59
这是我用C语言写的一个server程序,很简单。同时还有Client,就不发上来了,是TCP的。请各位告诉我怎么在连接的过程之后就知道对方的IP地址啊,谢谢了!!!!!!!!

//
// Server.cpp
//
#include <iostream.h>
#include <stdio.h>
#include <winsock.h>
#include <string.h>

#define MAXSIZE 16

void StreamServer(short nPort);

#define PRINTERROR(s) \
fprintf(stderr,"\n%: %d\n", s, WSAGetLastError())

////////////////////////////////////////////////////////////
void main(int argc, char **argv)
{
WORD wVersionRequested = MAKEWORD(1,1);
WSADATA wsaData;
int nRet;
short nPort;
if (argc != 2)
{
fprintf(stderr,"\nSyntax: server PortNumber\n");
nPort=2000;
}
else nPort = atoi(argv[1]);// Initialize WinSock and check version
nRet = WSAStartup(wVersionRequested, &wsaData);
if (wsaData.wVersion != wVersionRequested)
{
fprintf(stderr,"\n Wrong version\n");
return;
}// Do the stuff a stream server does
while (1)
{
StreamServer(nPort);
}
WSACleanup();// Release WinSock
}

////////////////////////////////////////////////////////////

void StreamServer(short nPort)
{
//
// Create a TCP/IP stream socket to "listen" with
//
SOCKET listenSocket;
int nLen;
char szBuf[MAXSIZE];
SOCKADDR_IN saServer;
int nRet;
SOCKET remoteSocket;

listenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (listenSocket == INVALID_SOCKET)
{
PRINTERROR("socket()");
return;
}
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = INADDR_ANY;
saServer.sin_port = htons(nPort);
nRet = bind(listenSocket,(LPSOCKADDR)&saServer,sizeof(struct sockaddr));
if (nRet == SOCKET_ERROR)
{
PRINTERROR("bind()");
closesocket(listenSocket);
return;
}
nLen = sizeof(SOCKADDR);
nRet = gethostname(szBuf, sizeof(szBuf));
if (nRet == SOCKET_ERROR)
{
PRINTERROR("gethostname()");
closesocket(listenSocket);
return;
}
nRet = listen(listenSocket,SOMAXCONN);
if (nRet == SOCKET_ERROR)
{
PRINTERROR("listen()");
closesocket(listenSocket);
return;
}
while (1)
{
remoteSocket = accept(listenSocket,NULL,NULL);
if (remoteSocket == INVALID_SOCKET)
{
PRINTERROR("accept()");
closesocket(listenSocket);
return;
}
memset(szBuf, 0, sizeof(szBuf));
nRet = recv(remoteSocket,szBuf,1,0);
if (nRet == INVALID_SOCKET)
{
PRINTERROR("recv()");
closesocket(listenSocket);
closesocket(remoteSocket);
getchar();
return;
}
szBuf[0] = 'r';
nRet = send(remoteSocket,szBuf,1,0);
}
closesocket(remoteSocket);
closesocket(listenSocket);
return;
}