1

このコードに出くわしたとき、私はCでソケットプログラミングを理解しようとしていました:

/* Sample UDP client */

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char**argv)
{
    int sockfd,n;
    struct sockaddr_in servaddr;
    char sendline[] = "Hello UDP server! This is UDP client";
    char recvline[1000];

    if (argc != 2)
    {
        printf("usage:  ./%s <IP address>\n",argv[0]);
        return -1;
    }

    sockfd=socket(AF_INET,SOCK_DGRAM,0);

    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr=inet_addr(argv[1]);
    servaddr.sin_port=htons(32000);

    sendto(sockfd,sendline,strlen(sendline),0,(struct sockaddr *)&servaddr,sizeof(servaddr));
    n=recvfrom(sockfd,recvline,10000,0,NULL,NULL);
    recvline[n]=0;
    printf("Received: %s\n",recvline);
    return 0;
}

recvfrom()メッセージを送信するために呼び出しに IP アドレスは必要ないようです。マニュアルページを見ると、次の行が明らかになりました。

src_addr が NULL ではなく、基になるプロトコルが送信元アドレスを提供する場合、この送信元アドレスが入力されます。src_addr が NULL の場合、何も入力されません。この場合、addrlen は使用されず、NULL にする必要があります。

したがって、基になるプロトコルが送信元 IP アドレスを提供すると思います。私の問題は、メッセージを受信するアドレスを実際にどのように把握するのですか? アドレスにメッセージを送信すると、同じソケットを使用して他のアドレスにメッセージを送信できないということですか? 同じアドレスを使い続けるには?

助けてください。Google や講義ノートのどこにも答えが見つかりませんでした。

前もって感謝します。

4

1 に答える 1

4

recvfrom特定の送信元アドレスからデータを取得するという誤解があります。

recvfrom通常、UDP などのコネクションレス プロトコルに使用されます。UDP パケットが受信されると、それは任意の送信元アドレスからのものである可能性があります。src_addrアプリケーションの使用のためにこのアドレスを返します。

特定のアドレスからのメッセージのみを期待している場合は、2 つの方法があります。(1) で返されたアドレスを比較することにより、他のアドレスから受信したパケットを無視することができますsrc_addr。または、(2) を使用connectして、メッセージを予期している特定のリモート アドレスを指定し、下位のソケット レイヤーが他のソースからのパケットを無視するように処理します。 . recv接続後、代わりに を使用することもできますrecvfrom

メッセージの送信は を通じて行われますsendto。2 つの呼び出しを混同しているようです。これを使用sendtoすると、同じソケットの異なるアドレスにメッセージを送信できます。

于 2014-06-21T15:10:36.793 に答える