Frage

Ich verwende Unix Scoket für die Datenübertragung (SOCK_STREAM -Modus)

Ich muss eine Reihe von mehr als 100.000 Zeichen senden. Erstens sende ich die Länge einer Zeichenfolge - es ist die Größe (int) Bytes.

length = strlen(s)
send(sd, length, sizeof(int))

Dann sende ich die ganze Zeichenfolge

bytesSend = send(sd, s, length)

Aber für meine Überraschung ist "Bytessend" weniger als "Länge".

Beachten Sie, dass dies gut funktioniert, wenn ich nicht so große Saiten sende. Möglicherweise gibt es einige Einschränkungen für den Systemanruf "Senden", den ich vermisst habe ...

War es hilfreich?

Lösung

Das send Systemanruf soll sein schnell, weil das Programm möglicherweise andere nützliche Dinge zu tun hat. Natürlich möchten Sie nicht darauf warten, dass die Daten verschickt werden, und der andere Computer, um eine Antwort zu senden - das würde zu einem schrecklichen Durchsatz führen.

So alles send Wirklich, es ist einige Daten zum Senden und Rücksenden der Kontrolle an das Programm. Der Kernel könnte Kopieren Sie die gesamte Nachricht in den Kernel -Speicher, aber dies würde viel Kernel -Speicher verbrauchen (nicht gut).

Stattdessen schlägt der Kernel nur so viel von der Nachricht an wie vernünftig. Es liegt in der Verantwortung des Programms, das Senden der verbleibenden Daten wieder zu versenden.

Verwenden Sie in Ihrem Fall eine Schleife, um die Daten zu senden, die beim ersten Mal nicht gesendet wurden.

while(length > 0) {
    bytesSent = send(sd, s, length);
    if (bytesSent == 0)
        break; //socket probably closed
    else if (bytesSent < 0)
        break; //handle errors appropriately
    s += bytesSent;
    length -= bytesSent;
}

Am Empfangsende müssen Sie wahrscheinlich dasselbe tun.

Andere Tipps

Ihre Initiale send() Anruf ist falsch. Sie müssen send () die Adresse der Daten übergeben, dh:

bytesSend = send(sd, &length, sizeof(int))

Außerdem geht dies auf klassische Risiken mit Endiangesgröße von klassischen Risiken aus int auf verschiedenen Plattformen, usw.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top