connect()を無限ループしてはいけない?
もともとはクライアント側を先に起動してlocalhostでconnect()した後で、サーバ側を立ち上げるとポート番号が使われてるからダメ、といわれてたのが大元で、理由を調べてみた。
その結果connect()を無限ループさせている間になぜかconncet()が0を返すのが原因だというのが分かった。以下コード。
int main(int argc, char **argv){ struct hostent *ent; struct in_addr in; struct sockaddr_in addr; int sock; char ip[300]; int32_t ret; ent = gethostbyname(argv[1]); in.s_addr = *(unsigned long*)ent->h_addr_list[0]; strncpy(ip, inet_ntoa(in), sizeof(ip)); sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(ip); addr.sin_port = htons(atoi(argv[2])); do{ ret = connect(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr)); printf("%s, %d\n", strerror(errno), ret); //perror(""); fflush(stdout); }while(ret < 0); }
$./a.out localhost 44444 ... ... Connection refused, -1 Connection refused, -1 Connection refused, 0
ちなみにperror()のコメントアウトをとると最後がIllegal Seek, 0に変わります。
再現性も微妙で二回連続で同じポート番号を指定すると無限ループして、変なことは起こらなくなる。
誰か理由が分かる方がいたら教えてください。
ちゃんとサーバ側から立ち上げるようにする、という決まりを守って無限ループさせるべきではないというのが今のところの結論か。