0

サーバーソケットに接続されたクライアントのIPとポートを取得しようとしています。次の関数クライアント ソケット ファイル記述子を渡しましたが、0.0.0.0: 0 が返されました

PS が返すアドレス長は 16 です。関数によって返される結果は 0 です。エラーは発生しません。

void    SocketServer::Log ( int socketFD , string message )
{
    struct sockaddr                     address;
    socklen_t                           addressLength;
    struct sockaddr_in*                 addressInternet;
    string                              ip;
    int                                 port;

    int result = getpeername ( socketFD , &address , &addressLength );
    cout << "Address length is " << addressLength << "     Return is " <<  result << "\n";
    addressInternet = (struct sockaddr_in*)&address;

    ip = inet_ntoa ( addressInternet->sin_addr );
    port = ntohs ( addressInternet->sin_port );

    cout << "Socket FD is " << socketFD << " " << ip << ":" << port << " " <<  message << "\n";
};
4

2 に答える 2

3

addressLengthを呼び出す前に設定するのを忘れましたgetpeername。必要なもの:

addressLength = sizeof(address);

ドキュメントにあるように:

提供されたバッファが小さすぎる場合、返されるアドレスは切り捨てられます

于 2012-08-16T20:27:07.263 に答える
2

インスタンスの代わりに完全なsockaddr_inインスタンスを渡す必要があり、呼び出す前にを設定する必要があります。getpeername()sockaddraddressLengthgetpeername()

void SocketServer::Log ( int socketFD , string message )       
{       
    struct sockaddr_in                  address = {0};       
    socklen_t                           addressLength = sizeof(address);       
    string                              ip;       
    int                                 port;       

    int result = getpeername ( socketFD , (struct sockaddr*) &address , &addressLength );       
    cout << "Address length is " << addressLength << "     Return is " <<  result << endl;       

    ip = inet_ntoa ( address.sin_addr );       
    port = ntohs ( address.sin_port );       

    cout << "Socket FD is " << socketFD << " " << ip << ":" << port << " " <<  message << endl;       
}; 
于 2012-08-16T20:33:37.517 に答える