0

利用可能なポートを TCP ソケットにバインドする作業を行っています。最初に、サーバー コードを作成したときに、システムがリッスンするポートを定義済みに設定しましたが、これは完全に機能しました。ただし、コードを変換して開いているポートにバインドし、使用されているポートを出力すると、telnet 経由でサーバーに接続できません。

コードを定義済みのポートを使用するように変換したときに、別の興味深い異常に遭遇しました。繰り返しになりますが、サーバーは事前定義されたポートで期待どおりに動作しましたが、使用していると報告されたポートは、割り当てたものとは異なりました。

この最初のコード スニペットは、ソケットを作成し、定義済みのポート (32000) を使用します。

/*Create TCP socket with a predefined port*/
listener = socket(AF_INET, SOCK_STREAM, 0);
if(listener == -1) {
    perror("Create socket");
    exit(1);
}/*End if*/

bzero(&servaddr, sizeof(servaddr));/*Set serraddr to 0's*/
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);/*Any of this host's interfaces is OK.*/
servaddr.sin_port = htons(32000);
bind(listener, (struct sockaddr *)&servaddr, sizeof(servaddr));
length = sizeof(servaddr);
/*getsockname(listener, (struct sockaddr *)&servaddr, &length);/*Find out port number*/
printf("RSTREAM:: assigned port number %d\n", servaddr.sin_port);

この 2 番目のコード スニペットは、使用可能なポートを使用します。servaddr.sin_port を 0 に設定してみました。これは、システムが利用可能なポートを提供することを意味すると読んだからです。念のため、この行をコメントアウトしてみましたが、結果は同じでした。

/*Create TCP socket with an open port*/
listener = socket(AF_INET, SOCK_STREAM, 0);
if(listener == -1) {
    perror("Create socket");
    exit(1);
}/*End if*/

bzero(&servaddr, sizeof(servaddr));/*Set serraddr to 0's*/
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);/*Any of this host's interfaces is OK.*/
servaddr.sin_port = htons(0);/*bind() will provide unique port.*/
bind(listener, (struct sockaddr *)&servaddr, sizeof(servaddr));
length = sizeof(servaddr);
getsockname(listener, (struct sockaddr *)&servaddr, &length);/*Find out port number*/
printf("RSTREAM:: assigned port number %d\n", servaddr.sin_port);
4

1 に答える 1