Question

Hé les gars, je ne sais pas si cette question a été posée encore, mais imaginez la situation suivante:

J'ai deux TCP Assemblages (ouvert avec NSSocketPort und écoute avec deux NSFileHandle) et maintenant je veux envoyer une NSData entre eux.

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

Tout est bien jusqu'à ce que je veux envoyer une instance de NSData avec plus d'une longueur de 32768 octets. Plus que ce nombre d'octets ne seront pas transférés. Alors, voici mes questions:

1) Pourquoi ne pas cacao en mesure d'envoyer plus de 32768 octets à la fois?
2) Est-ce que je dois faire contourner le problème?
3) Si oui, je diviser les données, mais comment voulez-vous faire? Et comment l'autre prise sache quand toutes les données sont envoyées?

Par ailleurs, après l'envoi de cette seule instance NSData les deux prises doivent être fermées à nouveau.

Était-ce utile?

La solution

La quantité de données envoyées à un moment dépend de la taille de la mémoire tampon que les cadres et les bibliothèques sous-jacentes utilisent. Bien qu'il puisse être configurable, il est surtout hors de propos. L'avantage de TCP est qu'il soit garantit de livrer vos données (en un ou plusieurs paquets) ou échoue avec élégance.

  1. Vous ne devez pas partager vos données avant de les envoyer. Le système sous-jacent le fera pour vous.
  2. Sur la fin de réception, vous pouvez lire les données disponibles, puis attendez que plus d'octets arrivent, les processus, et ainsi de suite, jusqu'à ce qu'il n'y a plus de données disponibles. Lorsque l'expéditeur effectue l'envoi de ses données, il fermera la prise et le récepteur être averti.

Autres conseils

Votre problème n'est pas de cacao mais semble être une mauvaise compréhension conceptuelle des prises de courant.

TCP est un protocole de flux. Les limites d'écritures séparées ne seront pas conservés.

Si vous envoyez 32768 octets, la réception doit être préparé pour readData (ou quelque chose comme ça) pour revenir de nulle part un seul octet à 32768 octets. Si vous obtenez moins de 32768 octets, alors vous devriez lire à nouveau pour obtenir le reste. Ou peut-être pas tout le reste, et vous devez lire encore une fois. Il est à vous de concevoir votre protocole de réseau de sorte que la fin de réception sait quand il a toutes les données; par exemple en faisant précéder les données avec sa longueur.

Si writeData envoie moins que les données que vous avez dit à envoyer, appelez writeData à nouveau avec le reste des données. Et préparez-vous pour que pour envoyer également moins que vous avez demandé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top