2013-10-20 92 views
0

當select返回filw描述符已更改時,如何只從哪個套接字讀取數據?當FD改變時,即使FD在緩衝區中沒有數據,printf語句也會執行。如何僅從已更改的文件描述符中讀取

編輯:我正在閱讀的問題一直在閱讀,儘管我沒有發送任何數據。我使用1個套接字發送接收。

void receive(struct nodeData *nd, struct sockInfo *si){ 
char buffer[MAXBUF]; 
struct timeval timeout; 
timeout.tv_sec = 0; 
timeout.tv_usec = 1000; 
// ----Wait in select until file descriptors change---- 
int y = select(si->maxFD, &si->fd_read_set, NULL, NULL, &timeout); 

if (y <= 0) 
    return; 
for (int i=0; i < nd->netTopo->n; i++) { 
    /* ----Was it child i---- */ 
    if (FD_ISSET(si->mastFD[i], &si->fd_read_set)) { 
     read(si->mastFD[i], buffer, MAXBUF); 
     printf("%d %d %d \n",buffer[0], buffer[1], buffer[2]); 
    } 
} 
} 
+0

如果讀取返回'> 0',那麼一些數據就在那裏。你爲什麼認爲「沒有數據」?順便說一句,你必須存儲'read'返回的值,如果它小於3,那麼你的代碼正在讀垃圾。 – Mat

+1

@Mat小於3?咦? –

+0

爲了測試我只向1個套接字發送數據,並且打印語句多次打印出來,但是如果有意義的話它不打印任何東西。 – Donatello

回答

1
if (read(si->mastFD[i], buffer, MAXBUF) > 0) 
     printf("%d %d %d \n",buffer[0], buffer[1], buffer[2]); 

這是要打印的垃圾時間的3/4。它應該是:

int count = read(si->mastFD[i], buffer, MAXBUF); 
if (count >= 3) 
    printf("%d %d %d \n",buffer[0], buffer[1], buffer[2]); 
else if (count == 2) 
    printf("%d %d \n",buffer[0], buffer[1]); 
else if (count == 1) 
    printf("%d \n",buffer[0]); 
else if (count == 0) 
{ 
    printf("EOS on %d \n",si->mastFD[i]); 
    close(si->mastFD[i]); 
} 
else if (count < 0) 
{ 
    printf("error on %d: %s \n",si->mastFD[i], strerr[errno]); 
    close(si->mastFD[i]); 
} 
相關問題