私は経験豊富なLinuxソケットプログラマーであり、多くの発信インターフェイスを備えたサーバーアプリケーションを作成しています。これで、サーバーソケットは、プロセスの開始時にINADDR_ANYとともにランダムな送信元ポートにバインドされます。
後で特定のノードに応答を送信するときのある時点で、固定の送信元IPアドレスを割り当てる必要があります。これを行う標準的な方法は、bindを呼び出すことです。ただし、bindはポート番号に対して1回呼び出され、後続の呼び出しは無効な引数エラーで失敗します。
新しいソケットを作成することは、実際には良い選択ではありません。これは、一部のクライアントに応答するときに頻繁に行う必要があるためです。
SOや、IP_FREEBINDなどの多くのソケットオプションについても調べましたが、私のシナリオにはあまり適していません。
おそらく、IP_PKT_INFOを使用して送信元アドレスを設定すると、同じ問題が発生しない限り、つまり、INADDRANYにバインドされたソケットが固定ソースIPに再バインドできない場合を除いて機能する可能性があります。
既存のソケットのバインドを解除する方法、または送信パケットに送信元IPアドレスを設定する別の方法はありますか?
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock < 0)
printf("Failed creating socket\n");
struct sockaddr_in addr;
memset(&addr, 0, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(1500);
addr.sin_addr.s_addr = INADDR_ANY;
// first bind succeeds
if ( (status = bind(sock, (struct sockaddr *) &addr, sizeof(addr))) < 0)
printf("bind error with port %s\n", strerror(errno));
struct sockaddr_in src_addr;
memset(&src_addr, 0, sizeof(struct sockaddr_in));
src_addr.sin_family = AF_INET;
if (inet_aton("10.0.2.17", &(src_addr.sin_addr)) == 0)
printf("Failed copying address\n");
// second bind fails
if((status = bind(sock, (struct sockaddr *)&src_addr, sizeof(src_addr))) < 0)
printf("re bind error with ip %s\n", strerror(errno));
この点に関するアイデアは高く評価されます。私はソケットやSOなどについてかなりの資料を調べましたが、まだ成功していません。