1

Cソケットで送信者IPと(動的に取得された)ポートを取得することは可能ですか? 私は次のものを持っています:

memset(&hints, 0, sizeof hints); 
hints.ai_family     = AF_UNSPEC; 
hints.ai_socktype   = SOCK_DGRAM;

if ((rv = getaddrinfo(NULL, DATABASEPORT, &hints, &servinfo)) != 0) { 
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
    exit(1);
}

for(p = servinfo; p != NULL; p = p->ai_next) {
    if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
        perror("socket"); 
        continue;
    }

    break;
}

これはほとんどガイドから取られています (私はそれを理解していますか?)。しかし、クライアント データを見つけるためにどの情報を使用するかを特定するのに苦労しています。

どんな助けでも大歓迎です、ありがとう!

4

2 に答える 2

3

通常、ローカル アドレス/ポート情報は で取得しますgetsockname(2)が、ここではまだ取得していません。ソケットが接続されておらず、何も送信されていません。これが単純な UDP クライアントの場合 -接続された UDP ソケットの使用を検討してください - の直後にローカル IP/ポートを確認できますconnect(2)

于 2010-11-09T00:11:02.043 に答える
0

接続されていない UDP ソケットの場合、ローカル アドレスを取得する方法はありません。もちろん、 /recvfromの代わりに使用してパケットを読み取ることにより、リモートアドレスを取得できます。単一のサーバーとのみ通信する場合は、そのまま使用してください。複数のサーバーと通信する必要がある場合は、ローカル アドレスを取得するためにサーバーの 1 つに (新しいソケット上で) ダミーを作成することができますが、(ホストが重要なルーティングを使用している場合) 別のサーバーに接続する可能性があります。リモート ホストは異なるローカル アドレスになります。これは、 ( ) とリモート サーバーの両方に接続している場合、かなり些細な環境でも発生する可能性があります。readrecvconnectconnectlocalhost127.0.0.1

于 2010-11-09T00:28:51.803 に答える