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時間悩んだよ。