0

inet_ntoa()関数は、次のコードでセグメンテーション違反エラーを引き起こします。教えてください、なぜ、お願いします。そして、どうすれば修正できますか?どうもありがとう!

void ClientAdd ( int clientSocket )
{
    sockaddr            clientAddress;
    socklen_t           clientAddressLength;
    sockaddr_in*        clientAddressInternet;
    char*               clientHost;

    getpeername ( clientSocket , &clientAddress , &clientAddressLength );
    clientAddressInternet = (struct sockaddr_in*)&clientAddress;
    clientHost = inet_ntoa ( clientAddressInternet->sin_addr );
};

inet_ntoaの戻り値がすべてだと思います。しかし、私は見つける方法がわかりません...

PSをg++@debianでコンパイル

4

1 に答える 1

2

getpeernameクライアントアドレスとクライアントアドレスの長さを書き込むことができるメモリを指す2つのポインタが渡されることを期待しています。だからあなたの元のコード

sockaddr*            clientAddress;
socklen_t*           clientAddressLength;

getpeername ( clientSocket , clientAddress , clientAddressLength );

2つのポインタclientAddressclientAddressLengthが初期化されていないため、間違っています。これらのポインタはメモリ内の任意の場所を指しているため、ポインタに書き込むと、すぐにではなく、すぐにプログラムがクラッシュする可能性があります。正しく呼び出す最も簡単な方法getpeernameは、2つのポインターではなく、2つの変数を宣言してから、address-of演算子「&」を使用してこれらの変数のアドレスをに渡すことgetpeernameです。このような

sockaddr            clientAddress;
socklen_t           clientAddressLength;

getpeername ( clientSocket , &clientAddress , &clientAddressLength );
于 2012-08-06T05:35:40.543 に答える