Steckdosen mit libev
Iam-suchen zu schreiben eine socket-Programm basiert auf libev. Ich bemerkte, dass mehrere Beispiele, wie dies in https://github.com/coolaj86/libev-examples/blob/master/src/unix-echo-server.c verwenden Sie die call-backs basierend auf init. Zum Beispiel,
main() {
......
ev_io_init(&client.io, client_cb, client.fd, EV_READ|EV_WRITE);
ev_io_start(EV_A_ &server.io);
}
static void client_cb (EV_P_ ev_io *w, int revents)
{
if (revents & EV_READ)
{
....
} else if (revents & EV_WRITE) {
......
}
}
Meine Frage kommt aus dem erwarteten Verhalten, zum Beispiel sagen, alle, die ich Lesen, wenn in EV_READ werden in einer verknüpften Liste. Können sagen, ich bekomme den freien Fluss der Pakete zu Lesen, werde ich jemals die chance bekommen, um in EV_WRITE? Ich habe zu senden, alles, was ich "recv" - Vorgang durch Lesen, um einen anderen sockel. So Wird es einmal sein EV_READ und zweiten mal EV_WRITE? In anderen Worten wird, wenn EV_WRITE freigeschaltet? Oder muss ich block EV_READ für EV_WRITE genannt zu werden. Kann mir jemand helfen, dies verstehen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort kurz: Wenn Sie immer überprüfen, die für einen Ereignistyp, der erste und dann ein
else
für die anderen riskieren Sie den Hungertod. Im Allgemeinen würde ich prüfen, für beide, es sei denn, der angegebene Protokoll machte es unmöglich, für beide werden gleichzeitig aktiviert.if
Hier ist eine iffy Antwort:
Der link in deiner Frage nicht enthalten ist eine code-Struktur, wie deine Frage. Der client https://github.com/coolaj86/libev-examples/blob/master/src/unix-echo-client.c hat einen ähnlichen Rückruf. Sie werden feststellen, es deaktiviert die Ereignisse schreiben, wenn es einmal geschrieben.
Aussieht wie ein Versuch, um zu vermeiden die Verschwendung von der pipe LESEN Veranstaltungsbranche. Auch wenn Im nicht sehr vertraut mit libev, die github-Beispiele, die du verlinkt scheinen nicht sehr robust. E. g
static void stdin_cb (EV_P_ ev_io *w, int revents)
nicht mit der return-Wert vongetline()
zum erkennen von EOF. Auch diesend()
undrecv()
socket-operation Rückgabewerte nicht überprüft, wie viel gelesen oder geschrieben wurde (obwohl auf lokale named pipe-streams die Beträge werden am ehesten entsprechen die Beträge, die angefordert wurden). Wenn dies wurde später geändert, um eine TCP-basierte Verbindung, die überprüfung der Mengen unerlässlich sein würde.if()
- Anweisungen anstelle vonif-else
.Ich denke, Sie sollten schreiben Rückruf getrennt vom Lesen Rückruf:
Dies ist meine Lösung.