Frage

Hey Jungs, ich weiß nicht, ob diese Frage noch nicht, aber gefragt wurde, vorstellen, folgende Situation vor:

Ich habe zwei TCP-Sockets (geöffnet mit NSSocketPort und mit zwei NSFileHandle hören) und jetzt will ich zwischen ihnen etwas NSData senden.

@try {
    [fileHandle writeData:data];
}
@catch (NSException * e) {
    // Do some alert
}

Alles ist richtig, bis ich eine NSData Instanz mit mehr als einer Länge von 32768 Bytes senden möchten. Mehr als diese Anzahl von Bytes wird nicht übertragen. So, hier sind meine Fragen:

1) Warum ist nicht Cocoa Lage, mehr als 32.768 Bytes auf einmal schicken?
2) Muss ich auf Abhilfe machen?
3) Wenn ja, würde ich die Daten geteilt, aber wie würden Sie es tun? Und wie würden die anderen Buchse wissen, wenn alle Daten gesendet werden?

Durch die Art und Weise, nach der dieser einzelnen NSData Instanz senden beide Buchsen wieder geschlossen werden sollen.

War es hilfreich?

Lösung

Die Menge an Daten zu einer Zeit gesendet, hängt von der Größe des Puffers, die der zugrunde liegende Frameworks und Bibliotheken. Während es konfigurierbar sein kann, ist es meist nicht relevant. Der Vorteil von TCP ist, dass es entweder garantiert Ihre Daten zu liefern (in einem oder mehreren Paketen) oder nicht ordnungsgemäß.

  1. Sie müssen Ihre Daten nicht geteilt vor dem Versenden. Das zugrunde liegende System wird das für Sie tun.
  2. Auf der Empfangsseite, um die verfügbaren Daten lesen kann, dann warten, bis mehr Bytes ankommen, verarbeiten sie, und so weiter, bis keine Daten mehr zur Verfügung steht. Wenn der Sender seine Daten sendet abgeschlossen ist, werden die Steckdose in der Nähe und der Empfänger wird benachrichtigt,.

Andere Tipps

Ihr Problem ist nicht mit Cocoa aber erscheint ein konzeptionelles Missverständnis von Stream-Sockets zu sein.

TCP ist ein Stream-Protokoll. Die Grenzen der separaten Schreiben wird nicht gehalten werden.

Wenn Sie 32.768 Bytes senden, sollte das Empfangsende für readdata hergestellt werden (oder was auch immer es genannt wird) von überall zurückkehren ein einzelnes Byte auf 32768 Bytes. Wenn Sie weniger als 32.768 Bytes zu bekommen, dann sollten Sie wieder lesen Sie den Rest zu erhalten. Oder vielleicht auch nicht der ganze Rest, und Sie haben noch einmal zu lesen. Es liegt an Ihnen, Ihr Netzwerk-Protokoll so zu gestalten, das Empfangsende weiß, wann es alle Daten bekam; beispielsweise, indem die Daten mit seiner Länge prefixing.

Wenn writedata sendet weniger als die Daten, die Sie ihm gesagt zu senden, rufen Sie wieder writedata mit dem Rest der Daten. Und für hergestellt werden , die , um auch weniger zu schicken, als Sie gefragt.

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