編集:これは尋ねられたことの反対です。申し訳ありませんが、質問はユーザーが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 アドレスを選択し、ランダムなソース ポートをソケットに割り当てます。