【发布时间】:2017-08-11 21:14:34
【问题描述】:
我正在用 C 编写一个简单的客户端-服务器代码。 我被要求让服务器打印连接到它的客户端的 IP 地址。 但是,我似乎找不到从服务器控制台了解客户端 IP 地址的方法。 有没有办法做到这一点?
// Initialize Winsock.
if ( StartupRes != NO_ERROR )
{
printf( "error %ld at WSAStartup( ), ending program.\n", WSAGetLastError() );
// Tell the user that we could not find a usable WinSock DLL.
return;
}
/* The WinSock DLL is acceptable. Proceed. */
// Create a socket.
MainSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( MainSocket == INVALID_SOCKET )
{
printf( "Error at socket( ): %ld\n", WSAGetLastError( ) );
return;
}
// Create a sockaddr_in object and set its values.
// Declare variables
Address = inet_addr(CHANNEL_IP);
if ( Address == INADDR_NONE )
{
printf("The string \"%s\" cannot be converted into an ip address. ending program.\n",
CHANNEL_IP);
return;
}
service.sin_family = AF_INET;
service.sin_addr.s_addr = Address;
service.sin_port = htons(clientinfo->senderPort);
//Bind the socket
bindRes = bind( MainSocket, ( SOCKADDR* ) &service, sizeof( service ) );
if ( bindRes == SOCKET_ERROR )
{
printf( "Channel-bind( ) failed with error %ld. Ending program\n", WSAGetLastError( ) );
return;
}
// Listen on the Socket.
ListenRes = listen( MainSocket, SOMAXCONN );
if ( ListenRes == SOCKET_ERROR )
{
printf( "Failed listening on socket, error %ld.\n", WSAGetLastError() );
return;
}
printf("Channel waiting for sender to connect...\n");
//Accepting connection
SenderSocket = accept( MainSocket, NULL, NULL );
if ( SenderSocket == INVALID_SOCKET ){
printf( "Accepting connection with client failed, error %ld\n", WSAGetLastError() ) ;
return;}
else
printf( "Sender Connected.\n" );
【问题讨论】:
-
两种方式:当您接受客户端时,您将从
accept函数中获取其地址。如果你把它扔掉,你就有了getpeername函数。 -
或者您的问题是关于如何从
sockaddr_in结构中获取 IP 地址(以及可能的端口号)(链接副本中的 non-accepted 回答答案)?目前还不清楚你的目标是什么。