1

クライアント プログラムとサーバー プログラムの両方でポート番号を定義しました。クライアントからパケットを受信する単純な udp サーバー プログラムを起動します。サーバーはパケットを取得しますが、クライアント情報を出力すると、ポート番号は Random number (51958) How to get the correct port number として認識されます。つまり、私が定義した数です。

  #define PORT XYZ
       ...
     if((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
        diep("socket");

      memset((char *) &si_me, 0, sizeof(si_me));

      si_me.sin_family = AF_INET;
      si_me.sin_port = htons(PORT);
      si_me.sin_addr.s_addr = htonl(INADDR_ANY);

      if(bind(s, (struct sockaddr *) &si_me, sizeof(si_me)) == -1)
        diep("bind");

      for(i = 0; i < NPACK; i += 1) {
        if(recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen) == -1)
          diep("recvfrom()");

        printf("Recieved packet from %s: %d\nData: %s\n\n", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port), buf);
      }
      close(s);

/// クライアント

   #define PORT XYZ

   if((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
                diep("socket");

        memset((char *) &si_other, 0, sizeof(si_other));

        si_other.sin_family = AF_INET;
        si_other.sin_port = htons(PORT);
        if(inet_aton(SRV_IP, &si_other.sin_addr) == 0) {
                fprintf(stderr, "inet_aton() failed\n");
                exit(1);
        }

        {
                for(i = 0; i < NPACK; i += 1) {
                        printf("Sending packet %d\n", index);
                        sprintf(buf, "This is packet%d\n", index);
                     ;
                        if(sendto(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, slen) == -1)
                                diep("sendto()");
                        index++;
                }

        }
        close(s);

更新 N 個のソケットで送信されたデータがあり、サーバー側でデータを受信する while(1) ループにいる場合、クライアントが送信したポートをどのように識別しますか?

4

2 に答える 2

2

クライアントの送信元ポートを出力しているため(クライアントホストは、他に指定されていない場合はランダムな空きポートを使用します)、サーバーがリッスンしている宛先ポートではなく、実際には正しいポート番号だと思います

複数のソケットがある場合は、getsocknameでバインドされているポートを取得できます

if (getsockname(sock, (struct sockaddr *)&sin, &len) == -1)
    perror("getsockname");
else
    printf("port number of the listening socket %d\n", ntohs(sin.sin_port));
于 2013-04-05T14:24:32.740 に答える
0

クライアントソケットを特定のポートにバインドしていないため、システムが割り当てたポートを取得します。

于 2013-04-06T00:23:39.660 に答える