1
我認爲關閉TCP連接(調用文件描述符的close())會將其置於停止發送數據的狀態,但仍然可以接收數據,直到同行也關閉它的套接字。但是,在測試此操作時,我會在recv()調用中收到「Bad File Descriptor」。我會預期recv()返回代碼= 0。請注意,select()調用已成功。Linux:close()後recv返回「壞文件描述符」
if (0 != close(sockfd))
{
err_sys("close failed");
}
printf("select waiting for response\n");
FD_ZERO(&rset);
FD_SET(sockfd, &rset);
wset = rset;
printf("select waiting for response\n");
if ((stat = select(sockfd + 1, &rset, NULL, NULL, NULL)) == 0)
{
errno = ETIMEDOUT;
err_sys("connect timed out");
}
printf("got response\n");
stat = recv(sockfd, buff, sizeof(buff), 0);
if (0 == stat) {
printf("remote closed\n");
}
else if (-1 == stat) {
if (errno == EWOULDBLOCK || errno == EAGAIN) {
err_sys("would block again\n");
} else {
err_sys("recv failed");
}
} else {
err_sys("unexpected return code");
}
不,不這樣做。你已經描述過關閉(sd,SHUT_WR),而不是close()。' – EJP