Shammer's Philosophy

My private adversaria

クライアントのポートを固定するー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してみたらどうなるんだろうって試してみただけなんだけれども。順序は、

  1. socket 実行
  2. connect 前にクライアントで使用させたいアドレスやポートを指定した sockaddr_in の構造体を作る
  3. socket にその構造体を bind
  4. connect

という流れになる。netstat は見ていないけれども、とりあえずコンパイルできたし実行もできた。