まず第一に、これはこれとは別の問題であると言いたい:似ているが同じではない
私のコードは次のようになります:
struct addrinfo hints, *res;
struct sockaddr* serveraddr;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
int res2 = getaddrinfo(ip, port, &hints, &res);
printf("getaddrinfo() res: %d, %d\n", res2, errno);
serveraddr = res->ai_addr;
//create new socket
int soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
printf("socket() res: %d, %d\n", socket, errno);
//set nonblocking mode
unsigned long on = 1;
res2 = ioctl(soc, FIONBIO, &on);
printf("ioctl() res: %d\n, %d", res2, errno);
res2 = connect(soc, serveraddr, sizeof(struct sockaddr));
printf("connect() res: %d, %d\n", res2, errno);
//check if socket is ready
fd_set wfds;
FD_ZERO(&wfds);
FD_SET(soc, &wfds);
struct timeval t;
t.tv_sec=15;
t.tv_usec=0;
res2 = select(soc + 1, 0, &wfds, 0, &t);
printf("select() res: %d, %d\n", res2, errno);`
存在するマシンに接続しています(IPアドレスは存在しますが、接続しようとしているポートでリッスンしているサーバーがありません)。
Selectは常に1を返します。なぜですか?人によると、タイムアウトして0を返す必要があります。この後、ソケットに何かを書き込もうとすると、-1/ECONNREFUSEDが返されます。
これは予想される動作ですか?はいの場合、select()が接続されているかどうかを確認するにはどうすればよいですか?