2

TCP を使用してサーバー プログラムを作成しており、受信したばかりのメッセージの送信者の IP アドレスを取得したいと考えています。これが私のコードです:

case FD_READ:
{    //Incoming data; get ready to receive
    char buffer[DEFAULT_BUFLEN];
    int bytes_received; 
    memset(buffer, '\0', sizeof(buffer));

    struct sockaddr_in recvIn;
    int recv_length = sizeof(struct sockaddr);

    memset((void *)&recvIn, '\0', recv_length);

    bytes_received = recvfrom(wParam, buffer, DEFAULT_BUFLEN, 0, (struct sockaddr *)&recvIn, &recv_length);
    cout << inet_ntoa(recvIn.sin_addr) << "\n";

    break;
}

そのため、Windows メッセージを使用して、パケットをチェックする必要があるかどうかを確認しています。データの受信は機能し、それとすべてを読み取ることができます。しかし、recvIn 変数は recvfrom によって変更されません。したがって、cout << inet_ntoa(recvIn.sin_addr) << "\n" を実行すると、"0.0.0.0" と書き込まれます。私はこの問題をグーグルで検索しましたが、この問題を抱えていた他のほとんどの人は recv_length を初期化するのを忘れていました。しかし、私はここでそれを正しく行ったと確信しています。誰かが私が間違っていることを見ることができますか? または、送信されているデータで何かを変更する必要がありますか? 着信データに IP アドレスがない可能性があります。私はTCPを使用しているため、これは非常に疑わしいものです。

お時間をいただきありがとうございます。これを解決できることを願っています。

4

2 に答える 2

5

TCP は接続指向のプロトコルです。UDP などのコネクションレス プロトコルで使用するためのものですfromドキュメントfromlenよると、接続指向のソケットは無視されます。recvfromfromfromlen

于 2012-10-13T13:33:50.430 に答える
3

接続された TCP ソケットの場合、getpeername()を使用してリモート ソケットのアドレスを取得する必要があります。

于 2012-10-13T13:33:04.260 に答える