2016-05-06 10 views
0

Ich erstelle epoll und registrieren einige nicht blockierende Sockets, die versuchen, mit geschlossenen Ports auf localhost zu verbinden. Warum epoll sagt mir, dass ich in diesen Socket schreiben kann (es gibt Ereignis für einen der erstellten Socket mit Eventmask enthalten EPOLLOUT)? Aber dieser Sockel öffnet sich nicht und wenn ich versuche, etwas zu senden, bekomme ich einen Fehler Connection refused.Epoll Ereignisse für das Verbinden von Sockets

Eine andere Frage - was bedeutet sogar EPOLLHUP? Ich dachte, dass dies ein Ereignis für eine abgewiesene Verbindung ist. Aber wie in diesem Fall kann Ereignis gleichzeitig EPOLLHUP und EPOLLOUT Ereignisse haben?

Beispielcode auf Python:

import socket 
import select 

poll = select.epoll() 
fd_to_sock = {} 
for i in range(1, 3): 
    s = socket.socket() 
    s.setblocking(0) 
    s.connect_ex(('localhost', i)) 
    poll.register(s, select.EPOLLOUT) 
    fd_to_sock[s.fileno()] = s 

print(poll.poll(0.1)) 
# prints '[(4, 28), (5, 28)]' 

Antwort

1

dass alle poll garantiert ist, dass die Anwendung blockiert nicht nach entsprechender Funktion aufrufen. Sie bekommen also, was Sie bezahlt haben - Sie können jetzt sicher sein, dass das Schreiben an diese Buchse nicht blockiert wird - und es wurde nicht blockiert, oder?

Die Abfrage garantiert nie, dass der entsprechende Vorgang erfolgreich ist.

+0

Oh, natürlich =) Danke, ich hatte ein Missverständnis, wie die 'Umfrage' funktioniert. –

1

zurückgeben, wenn der Dateideskriptor "bereit" ist, aber das bedeutet nur, dass die Operation nicht blockiert (nicht, dass Sie unbedingt erfolgreich darauf schreiben können).

Ebenso für EPOLLIN: zum Beispiel wird es bereit, wenn eine Steckdose geschlossen ist; In diesem Fall können Sie keine Daten lesen.

EPOLLHUP bedeutet, dass auf der Verbindung ein "Auflegen" aufgetreten ist. Das würde wirklich nur passieren, wenn du tatsächlich eine Verbindung hast. Außerdem sagt die Dokumentation (http://linux.die.net/man/2/epoll_ctl), dass Sie es nicht brauchen sowieso enthalten:

EPOLLHUP Auflegen auf dem zugehörigen Dateideskriptors passiert ist. epoll_wait (2) wird immer auf dieses Ereignis warten; Es ist nicht notwendig, es in Ereignisse zu setzen.

Verwandte Themen