使用select()函數測試套接字是否可讀時,如果select()函數的返回值是1,
而recv()()函數讀取的數據長度為0,就說明套接字已經斷開。
經過代碼測試,如果進程接收到壹些信號,比如:EINTR,當recv()的返回值小於等於0時,需要判斷errno是否等於EINTR。如果errno == EINTR,則說明程序收到信號後返回recv函數,socket連接仍然正常,socket連接應該不會關閉。
如果寫的話,我覺得還是要考慮的,就是寫的太快,緩沖區可能就滿了。這是,errno是EAGAIN,妳可以根據實際需要寫幾次。如果errno是EAGAIN。
當然,還有壹種情況類似於讀的時候寫,所以妳讀是為了檢查errno。如果是e-gain或者EINTR,最好不要馬上停止操作,試試EAGAIN!
這是我寫的代碼!
int SocketConnected(int sock)
{
int res,recvlen
char buf[20]= { ' \ 0 ' };
struct timeval超時={3,0 };
fd _ set rdfs
FD_ZERO。rdfs);
FD _ SET(sock & amp;rdfs);
res = select(sock+1,& amprdfs,NULL,NULL & amp;超時);
if(RES & gt;0){
recvlen = recv(sock,buf,sizeof(buf),0);
if(recv len & gt;0){
printf(" socket connected \ n ");
返回1;
} else if(recv len & lt;0 ){
if(errno == EINTR){
printf(" socket connected \ n ");
返回1;
}否則{
printf("插座斷開!再次連接!\ n ");
返回0;
}
} else if (recvlen == 0){
printf("插座斷開!再次連接\ n ");
返回0;
}
} else if(res == 0 ){
//超時
printf(" socket connected \ n ");
返回1;
} else if(RES & lt;0){
if (errno == EINTR){
printf(" socket connected \ n ");
返回1;
}否則{
printf("插座斷開!再次連接!\ n ");
返回0;
}
}
返回0;
}