Invia più di 32768 byte alla volta da un protocollo TCP-Socket ad un altro
-
19-09-2019 - |
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.
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.
- Non c'è bisogno di dividere i vostri dati prima di inviarli. Il sistema sottostante lo farà per voi.
- 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.