クライアントのポートを固定するーC言語版ー
Socketアプリケーションを作成した場合、
- サーバーは特定のポートにbindし、そのポートでlistenする
- クライアントはエフェメラルポートを使用する(ポートは意識しない)
というのが通常。
しかし、何らかのテストなども目的でクライアントのポートを固定したい場合もある。そのような場合の実装方法がわかったのでメモ。
/* Create socket */ if ( ( s = socket(AF_INET, SOCK_STREAM, 0) ) < 0 ){ fprintf(stderr, "Socket create failure!!!\n"); return 1; } /* Using same source port */ struct sockaddr_in client_sock; memset(&client_sock, 0, sizeof(client_sock)); char client_addr[] = "XXX.XXX.XXX.XXX"; unsigned short client_port = 8888; client_sock.sin_family = PF_INET; client_sock.sin_port = htons(client_port); inet_aton(client_addr, &(client_sock.sin_addr)); bind(s, (struct sockaddr *)&client_sock, sizeof(client_sock)); /* Connect host */ if ( connect(s, (struct sockaddr *)&server, sizeof(server)) == -1 ){ fprintf(stderr, "Can not connect.\n",); return 1; } ...
まあ、クライアントでもbindしてみたらどうなるんだろうって試してみただけなんだけれども。順序は、
- socket 実行
- connect 前にクライアントで使用させたいアドレスやポートを指定した sockaddr_in の構造体を作る
- socket にその構造体を bind
- connect