Domanda

Hey ragazzi, non so se questo problema è stato fatto ancora, ma immaginare seguente situazione:

Ho due TCP-Sockets (aperta con NSSocketPort und ascolto con due NSFileHandle) e ora voglio inviare alcune NSData tra di loro.

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

Tutto è proprio fino a quando voglio inviare un'istanza NSData con più di una lunghezza di 32768 byte. Più di questo numero di byte non sarà trasferito. Così qui sono le mie domande:

1) Perché non è di cacao in grado di inviare più di 32768 byte in una volta?
2) Devo fare soluzione?
3) Se sì, vorrei suddividere i dati, ma come lo fareste? E come l'altra presa di sapere quando tutti i dati sono inviati?

A proposito, dopo l'invio di questo singolo caso NSData entrambe le prese necessario chiudere nuovamente.

È stato utile?

Soluzione

La quantità di dati inviati alla volta dipende dalle dimensioni del buffer che conferisce alle strutture sottostanti e librerie usano. Mentre può essere configurabile, è per lo più irrilevante. Il vantaggio del protocollo TCP è che sia garantisce di fornire i propri dati (in uno o più pacchetti) o non riesce con grazia.

  1. Non c'è bisogno di dividere i vostri dati prima di inviarli. Il sistema sottostante lo farà per voi.
  2. sul lato di ricezione è possibile leggere i dati disponibili, quindi attendere più byte arrivano, li processo, e così via, fino a quando non più dati disponibili. Quando il mittente completato l'invio di propri dati, si chiuderà la presa e il ricevitore sarà ottenere una notifica.

Altri suggerimenti

Il problema non è con cacao, ma sembra essere un equivoco concettuale di stream socket.

TCP è un protocollo di flusso. Non saranno mantenuti i confini della scrittura separati.

Se si invia 32768 byte, alla fine di ricezione deve essere preparato per readData (o come si chiama) per tornare ovunque da un singolo byte a 32768 byte. Se si ottiene meno di 32768 byte, allora si dovrebbe leggere di nuovo per ottenere il resto. O forse non tutto il resto, e si deve leggere ancora una volta. E 'a voi per progettare il protocollo di rete in modo da ricevere la fine sa quando ha ottenuto tutti i dati; per esempio facendo precedere i dati con la sua lunghezza.

Se writeData invia meno i dati che ha detto per inviare, chiamare di nuovo writeData con il resto dei dati. Ed essere pronti per che per inviare anche meno di quanto chiesto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top