2014-02-24 90 views
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"); 
} 
+0

不,不這樣做。你已經描述過關閉(sd,SHUT_WR),而不是close()。' – EJP

回答