Frage

ich eine Anwendung, die wie eine p2p-Software an der Arbeit geht, wo alle Peer miteinander sprechen werden. Da die Kommunikation TCP sein wird, ich dachte, dass ich epool nutzen konnte (4) so dass mehrere Verbindungen können behandelt werden. Da jeder Peer-Daten senden wird sehr oft, dachte ich, dass ich eine persistente Verbindung zu jedem Peer etablieren werde, die unter den Anwendungen Lebensdauer verwendet werden.

Nun, eine Sache, die ich weiß nicht, wie zu handhaben ist, dass, da die Verbindung nie geschlossen, wie kann ich wissen, wenn ich Daten mit read() und Anruf epool_wait() Empfang wieder aufhören sollte nach mehr Paketen zu hören? Oder gibt es einen besseren Weg, mit persistenten TCP-Verbindungen des Umgangs?

War es hilfreich?

Lösung

Sie sollten die Steckdose nicht blockierend gesetzt, und wenn epoll gibt es Daten zu lesen Sie sollten read () in einer Schleife, bis read () kehrt rufen -1 und errno EWOULDBLOCK

Das heißt, Ihre Leseschleife sometihng aussehen könnte:

for(;;)
  ssize_t ret;
  ret = read(...);
  if(ret == 0) {
     //client disconnected, handle it, remove the fd from the epoll set
      break;
  } else if(ret == -1) {
     if(errno == EWOULDBLOCK) {
        // no more data, return to epoll loop
      } else {
        //error occured, handle it remove the fd from the epoll set
      }
      break;
  }

 // handle the read data 
}

Wenn Sie nicht flankengetriggert Modus mit epoll verwenden, können Sie nicht wirklich brauchen, um die Schleife - Sie tun nur 1 Lese- und Rückkehr in die epoll Schleife wegkommen konnte. Aber behandelt die Rückgabewerte ebenso wie der oben genannte Code.

scroll top