2013-03-13 3 views
5

Wie der Titel sagt, gibt es eine Begrenzung für die Anzahl der Bytes, die gleichzeitig auf einem verbindungsorientierten Socket geschrieben werden können?Wie viele Bytes kann ich gleichzeitig auf einem TCP-Socket schreiben?

Wenn ich will, einen Puffer, zum Beispiel senden, 1024 Bytes, kann ich ein

write(tcp_socket, buffer, 1024); 

oder soll ich verwenden, um mehr write() Anrufe mit einer geringeren Menge an Bytes für jeden?

+0

Vielleicht ein Duplikat http://stackoverflow.com/a/12934115/1758762 – duDE

+0

möglich Duplikat [C++ Socket-Programmierung Max Größe von tcp zu bleiben/ip socket Buffer?] (http://stackoverflow.com/questions/12931528/c-socket-programming-max-size-of-tcp-ip-socket-buffer) –

Antwort

9

write() garantiert nicht, dass alle Bytes geschrieben werden, so dass mehrere Aufrufe an write() erforderlich sind. Von man write:

Die Anzahl der Bytes kann geringer geschrieben sein als zählen, wenn zum Beispiel nicht genügend Platz auf dem zugrunde liegenden physikalischen Medium ist, oder das RLIMIT_FSIZE Ressourcengrenze angetroffen wird (siehe setrlimit (2)) oder der Aufruf wurde von einem Signal-Handler unterbrochen, nachdem weniger als die Anzahl Bytes geschrieben wurde. (Siehe auch die Leitung (7).)

write() gibt die Anzahl der Bytes geschrieben so eine laufende Summe der geschriebenen Bytes muss beibehalten und als Index in buffer verwendet werden, und die Anzahl der verbleibenden Bytes berechnet werden können geschrieben:

ssize_t total_bytes_written = 0; 
while (total_bytes_written != 1024) 
{ 
    assert(total_bytes_written < 1024); 
    ssize_t bytes_written = write(tcp_socket, 
            &buffer[total_bytes_written], 
            1024 - total_bytes_written); 
    if (bytes_written == -1) 
    { 
     /* Report failure and exit. */ 
     break; 
    } 
    total_bytes_written += bytes_written; 
} 
+0

Also kann ich zunächst jede 'Größe' verwenden und dann die Rückgabewerte überprüfen. Ist es richtig? – JustTrying

+1

@JustTrying, aktualisiert mit Beispielcode. – hmjd

+1

Warum hast du das 'assert()' da drin? Wie ist es möglich, diesen Zustand zu treffen? – Mike

-1

wie Sie sehen können write socket die maximale Puffergröße ist 1048576 Bytes.

+0

Nein. Bitte lesen Sie Ihre Quelle erneut. Das ist die maximale * Socket Sendepuffergröße, * auf dem * IBM z/TPF, * was auch immer das ist. Es ist * nicht * die maximale Menge an Daten, die Sie in einem einzigen 'send()' oder 'write()' senden können, was nur durch den Maximalwert des 'int' begrenzt wird, der die Länge angibt. – EJP

0

Es gibt keine inhärente Grenze. TCP/IP wird die Pakete nach Bedarf fragmentieren und neu zusammensetzen. Ihr System kann möglicherweise eine einstellbare Obergrenze festlegen, liegt jedoch wahrscheinlich im Multi-MB-Bereich. Sehen Sie Ihre Manpage für setsockopt() und überprüfen Sie immer den Rückgabewert von write().

0

Die tatsächliche Menge, die Sie schreiben können, hängt vom Socket-Typ ab. Im Allgemeinen müssen Sie den Rückgabewert überprüfen, um zu sehen, wie viele Bytes tatsächlich geschrieben wurden. Die Anzahl der geschriebenen Bytes hängt davon ab, ob sich der Socket im Sperrmodus befindet oder nicht.

Wenn der Socket blockiert, möchten Sie möglicherweise nicht warten, bis alle Daten auf einmal geschrieben wurden. Vielleicht möchten Sie einige gleichzeitig schreiben, um zwischen den Schreibvorgängen etwas anderes zu haben.

0

Aus meiner Erfahrung ist es besser, in der 1024-Byte-Grenze

Verwandte Themen