2016-03-24 14 views
0

Ich sende N Bytes von einem Unix-Domain-Socket (AF_UNIX, SOCK_DGRAM) zu einem anderen. Allerdings, wenn ich X-Bytes aus dem anderen Socket lesen, wo X < N, ein nachfolgender Aufruf von read() blockiert und ich kann nicht den Rest der N-X-Bytes erhalten.Die verfügbaren Bytes aus dem Unix-Domain-Socket können nicht abgerufen werden

Ist dies ein erwartetes Verhalten für Unix-Domain-Sockets? Ist der Rest der N-X Bytes vom Kernel geworfen? Gibt es eine Lösung, wie eine Socket-Option?

+0

Was sind diese Sockets - UDP oder TCP? – SergeyA

+0

Der Socket, den ich verwende, ist (AF_UNIX, SOCK_DGRAM) –

Antwort

3

Das von Ihnen beobachtete Verhalten ist nicht spezifisch für AF_UNIX Sockets. Es ist spezifisch für SOCK_DGRAM Steckdosen. Die Besonderheit von Datagramm-Sockets ist, dass sie nachrichtenorientiert sind.

Im Gegensatz zu TCP-Sockets, jedes Mal wenn Sie send() oder sendto() auf einem Datagramm-Socket aufrufen, erstellen Sie eine einzelne Nachricht. Sie sollten die ganze Nachricht mit einem einzelnen recv() oder recvfrom() Anruf lesen. Was auch immer nicht gelesen wurde, wird verworfen, und der nächste Anruf an recv() wird Ihnen die nächste Nachricht auf dem Draht geben.

Wenn eine stream-orientierte Kommunikation gewünscht wird, sollte stattdessen SOCK_STREAM verwendet werden.

Verwandte Themen