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);
}

出力が以下。ubuntu gcc 4.3.2

$./a.out localhost 44444
...
...
Connection refused, -1
Connection refused, -1
Connection refused, 0

ちなみにperror()のコメントアウトをとると最後がIllegal Seek, 0に変わります。

再現性も微妙で二回連続で同じポート番号を指定すると無限ループして、変なことは起こらなくなる。
誰か理由が分かる方がいたら教えてください。

ちゃんとサーバ側から立ち上げるようにする、という決まりを守って無限ループさせるべきではないというのが今のところの結論か。