|
FD_ZERO(&rset);
for(listnum=0;listnum<SerNum;listnum++) {
if(connectlist[listnum] != 0) {
FD_SET(connectlist[listnum], &rset);
if(connectlist[listnum] > highsock)
highsock = connectlist[listnum];
}
}
timeout.tv_sec = 1;
timeout.tv_usec = 0;
int i = select (highsock+3, &rset, Null, (fd_set *)0, &timeout);
if(i < 0) {
printf("select error\n");
return;
}
else if(i == 0) {
printf("Time Out.\n");
return;
}
else { //read data
for(i=0;i<SerNum;i++) {
if(FD_ISSET(connectlist, &rset)) { //有資料可讀
n = recv(connectlist, &readbuf[size-left], left, 0);
if(n<=0)
printf("socket disconnect\n");
}
}
}
socket is nonblocking socket.
同時select多條socket, 當有一條socket當掉, 因其他socket正常, 所以select回傅大於零的值就會進入read data裡. 用FD_ISSET來判斷那一個socket有資料可讀才讀. 所以那一個當掉的socket一直都沒有辦法偵測到.
請問有什麼好的辦法來偵測有socket當掉或太久沒有在傅資料呢?
希望大家多多指教, 謝謝. |
|