2013-10-20 55 views
1

我在多個套接字上偵聽時遇到問題。我有一個函數偵聽一堆套接字,但是當我測試並且只在一個套接字上發送數據時;對於每個套接字,FD_ISSET方法都會保持返回true,並且沒有數據會在緩衝區中返回給我沒有發送數據的套接字(因爲沒有數據)。我使用每個套接字發送和接收。 我在做什麼錯?FD_ISSET不斷讀取,雖然沒有數據c

編輯:請告訴我發生的事情是printf語句被打印多次時,它只能打印一次,因爲我只送1個插槽的數據。我已經加入了對read()> 0的返回值的測試,但它仍然沒有喜悅。

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); 
    printf("ID: %d Y %d\n", nd->id, y); 
    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]); // For Testing 
     } 
    } 
} 
+0

您是否每次調用'select()'時都重置'fd_read_set'?你需要,因爲'select()'改變了它,但是你沒有顯示準​​備'fd_read'set'的代碼。 –

+0

不,我每次都不重置讀取設置。我零一次然後設置它。每次我會在哪裏重置FD_SET? – Donatello

+0

我重置並且仍然沒有快樂 – Donatello

回答

1

您忽略了read的返回值。 EOF是可讀的條件(導致select報告文件描述符的可讀性,即FD_ISSET返回true),你需要通過read檢測返回0 EOF後,你可能要關閉的文件描述符,並從集中刪除它select上。

+0

感謝您的回覆。這些偵聽套接字是持久套接字,我需要在不久之後發送它們。那麼關閉它們並將它們從集合中刪除? – Donatello

+2

是的。當select()報告一個套接字是可讀的,然後read()從該套接字返回0時,這意味着peer已經關閉了連接,所以你需要關閉你的端套接字並停止使用它。 –