bindが失敗するのは何故?

問題の部分。

  /*make socket*/
  sock = socket(PF_INET, socktype, pproto->p_proto);
  if(sock<0){
    return -2;
    /* somehow we couldn`t make the socket */
  }

  /*bind socket*/
  if( bind(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1 ){
    close(sock);
    return -1;
    /* bind error */
  }
  • pprotoはstruct protoent型で、getprotobyname()の返り値を受け取ったもの
  • socktypeは条件判断によりSOCK_STREAMに設定されている
  • sinはstruct sockaddr_inとして定義し、各種設定を正しく行ったもの

これが動かない。
いや、正確に言うと、ソケットは作られてディスクリプタの3に繋がるんだけど、その後のbindが失敗するんだ。


条件分岐などを完全に外し、変数の設定を即値に変更したものが以下:

  int sock;
  struct sockaddr_in sin;

  memset(&sin, 0, sizeof(sin));
  sin.sin_family = AF_INET;
  sin.sin_addr.s_addr = htonl(INADDR_ANY);
  sin.sin_port = htons((short)7); /* 7 : echo server port */

  sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  bind(sock, (struct sockaddr *)&sin, sizeof(sin));

これは、本の例に書かれているのと全く同じ動作をするコードだ。つまり、全て正しく行われているはず。
それにもかかわらず、ソケットは作れてもbind()はできない、という状態に陥っていた。
いったいなぜ!?


ふと、とあることを思い出して実行してみたら、即座に解決した。
問題は、実行権限でした。
wellknownなポートを利用するプログラムは、管理者権限で動かさなきゃいけないっていう話でした。sudo ./a.outでした。


やれやれ。これだけで2時間悩んだよ。