1

私は次のPOSIXソケットの入門演習を解決しようとしています。

「システムがアドレスとポートの両方を選択するようにbind()を使用する」TCPエコークライアント実装を記述します。

(「システム」とはOSのことだと思います。)

connect()が前述の方法でバインドを実行するときにbind()呼び出しが必要な理由がわかりません(間違っている場合は修正してください)。また、bind()呼び出しに提供されるソケットアドレスがこの動作を実現するには、sin6_addrとsin6_portのどの値が必要ですか?

4

3 に答える 3

2

おっしゃる通り、bind電話は不要です。connectそうしないと、システムは送信元アドレスと送信元ポートを選択しますbind

これは演習です。この方法を使用する方法を知っているかどうかをテストしているだけですbind

于 2012-05-16T19:59:20.233 に答える
1

connect() が前述の方法でバインドを実行するときに bind() 呼び出しが必要な理由がわかりません (間違っている場合は修正してください)。

あなたは正しいです。

また、bind() 呼び出しでこの動作を実現するために提供されるソケット アドレスには、sin6_addr と sin6_port のどの値が必要ですか?

IPv4 の場合は INADDR_ANY。IPv6 は、読者の演習として残しておきます。

また、ポート番号としてゼロを指定する必要があります。その後、システムが選択します。

于 2012-05-17T02:18:00.307 に答える
-1

編集:これは尋ねられたことの反対です。申し訳ありませんが、質問はユーザーがIP アドレスとポートの両方を選択することに関するものだと思いました。それを指摘してくれたEJPに感謝します。


これはあなたが探しているものでなければなりません。

そして、これが最も興味深い部分です。

clnt_addr.sin_family = AF_INET;
clnt_addr.sin_addr.s_addr = INADDR_ANY;
clnt_addr.sin_port = htons(33333);
if (bind(sockfd, (struct sockaddr *) &clnt_addr,
          sizeof(clnt_addr)) < 0) 
          error("ERROR on binding");

この例では、ソケットは connect() の前に目的のポート (33333) にのみバインドされていますが、演習では、上記のコードの 2 行目を次のように変更できます。

clnt_addr.sin_addr.s_addr = inet_addr("192.168.0.1");

ソケットを特定の IP アドレスにもバインドします。ここで重要なのは、connect() が TCP/IP 通信のエンドポイントを目的の IP アドレス/ポートを使用するように設定する前にソケットをバインドすることです。bind() がなければ、ソケットは無制限になります。カーネルがソース IP アドレスを選択し、ランダムなソース ポートをソケットに割り当てます。

于 2012-05-16T20:14:55.803 に答える