2016-10-18 1 views
0

In UNIX-Domänen-Socket (AF_UNIX Typ & DGRAM), wenn ein Leser langsam ist, die Nr. der Pakete in der Warteschlange ist 'max_dgram_qlen'. Gibt es eine Möglichkeit, Bytes zu identifizieren, die in der Warteschlange (oder) enthalten sind? von mehr Bytes frei in der Warteschlange entweder auf der Sender- oder Empfängerseite. Oder zumindest ist der Schreiber blockiert, wenn die Warteschlange voll ist. Gibt es eine Möglichkeit, das Writer-Block-Ereignis zu identifizieren? Vielen Dank im Voraus.Unix-Domäne-Socket-Warteschlange-Details

+1

fyi ... AF_INET + SOCK_DGRAM ist kein Unix-Domain-Socket, sondern ein TCP/IP-Socket mit UDP. – selbie

+0

Mögliches Duplikat von: http://stackoverflow.com/questions/16427842/how-many-packets-or-bytes-are-in-the-socket-receive-queue. Aber ich denke, Sie fragen, wie viele Bytes auf der Senderseite eingereiht sind. – selbie

+0

Ich habe die Frage bearbeitet. Und danke für Ihren Vorschlag. –

Antwort

0
  1. Sie können die ioctl verwenden, um herauszufinden.

einen Schreibpuffer Um zu überprüfen, ob sie leer (Sie bereits Daten dort gesetzt haben, übernehmen und überprüfen wollen, wenn sie verbraucht wurden):

ioctl(fd, SIOCOUTQ, &pending); 

Wo fd den Dateideskriptor der Buchse ist und in Erwartung der Variable Die verbleibende Datenmenge wird zurückgegeben.

einen Lesepuffer Um zu überprüfen, ob es leer ist (unter der Annahme, jemand bereits Daten dort gesetzt, und Sie möchten überprüfen, ob sie es eine ist, sie ohne Verbrauch):

ioctl(fd, SIOCINQ, &pending); 
/*note the difference on the second parameter, where we change the flag from SIOCOUTQ to SIOCINQ*/ 
  1. Basierend auf der Fehlermeldung, die von der Funktion send() zurückgegeben wird, können wir das Ereignis Puffer voll identifizieren. Durch Überprüfung der Fehler == ENOBUFS können Sie den Puffer voll identifizieren.
+0

2 ist falsch. Es bezieht sich auf den Gerätepuffer, nicht auf den Socket-Puffer. "ENOBUFS: Die Ausgabewarteschlange für eine Netzwerkschnittstelle war voll. Dies bedeutet in der Regel, dass die Schnittstelle nicht mehr gesendet wird, aber möglicherweise aufgrund vorübergehender Überlastung ist. (Normalerweise tritt dies unter Linux nicht auf. Pakete werden einfach stillgelegt, wenn ein Gerät Warteschlange Überläufe.) " – sourcejedi

1

Sie sollten Ihren Dateideskriptor als nicht blockierend festlegen und select verwenden, um festzustellen, ob zum aktuellen Zeitpunkt geschrieben werden kann.