2017-02-27 1 views
2

Ich lese von zwei Sockets mit Select, und ich sende nur eine Nachricht von jedem Socket. Die Auswahl scheint niemals zu Timeout zu gehen, sondern gibt immer entweder 1 oder 2 mit derselben Nachricht immer wieder zurück. Ich setze die Auswahlparameter jedes Mal neu, wenn ich die while-Schleife durchlaufe.Auswahl liefert immer Daten

Hier ist mein Code:

while(1) 
{ 
    FD_ZERO(&master); 
    for (i = 0; i < fdmax; i++) 
    { 
     FD_SET(sock_list[i], &master); 
    } 
    tv.tv_sec = 1; 
    tv.tv_usec = 300; 

    int sel = select(fdmax, &master, NULL, NULL, &tv); 
    if (sel > 0) 
    { 
     for (i = 0; i < fdmax; i++) 
     { 
      if (FD_ISSET(i, &master)) 
      { 
       recv_msg(i, buf); 
       print("msg from %d: %s %d %d\n", i, buf, sel, tv.tv_sec); 
      } 
     } 
    } 
} 

Hat ein Problem mit meinem wählen jemand sehen?

+0

Das Problem ist, wahrscheinlicher in 'recv_msg', weil es scheint, dass Sie die Daten nie (vollständig) lesen: daher sagt' select' Ihnen, dass Daten verfügbar sind – Kninnug

+0

tat Sie überprüfen, dass recv_msg funktioniert? – pm100

+0

Sie überprüfen nicht den Rückgabewert von 'recv_msg'. Überprüfen Sie, ob der Socket geschlossen ist oder ob ein Lesefehler vorliegt. Schließen Sie diese Sockets und entfernen Sie sie aus Ihrer Liste. – jxh

Antwort

1

Der erste zu wählende Parameter() ist eins höher als der höchste Socket-Wert, NICHT ein Zählwert der Anzahl der Socket-Werte +1.

Es ist 'ok' den ersten Parameter zu schreiben, wie:

select(FD_SETSIZE+1, ....); 

diese Zeile:

if (FD_ISSET(i, &master)) 

nicht das Richtige überprüfen vorschlagen:

if (FD_ISSET(sock_list[i], &master)) 
Verwandte Themen