【问题标题】:How to get client IP by the socket number in C如何通过C中的套接字号获取客户端IP
【发布时间】: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" );

【问题讨论】:

标签: c server ip client


【解决方案1】:

您需要将第二个和第三个参数的非空值传递给accept

struct sockaddr_in client_addr;
socklen_t slen = sizeof(client_addr);
SenderSocket = accept( MainSocket, (struct sockaddr *)&client_addr, &slen );

然后您可以从client_addr 获取客户端的IP 和端口。

【讨论】:

    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 2016-01-01
    • 2019-08-28
    • 2014-11-28
    • 1970-01-01
    • 2011-04-17
    • 2018-09-08
    • 2020-01-08
    相关资源
    最近更新 更多