Pergunta

Ei, eu não sei se esta pergunta tem sido feita ainda, mas imagine seguinte situação:

Eu tenho dois TCP-Sockets (aberto com NSSocketPort und audição com dois NSFileHandle) e agora eu quero enviar alguns NSData entre eles.

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

Tudo está bem até que eu quiser enviar uma instância NSData com mais de um comprimento de 32768 Bytes. Mais do que esse número de bytes não será transferido. Então, aqui estão minhas perguntas:

1) Por que não Cacau capaz de enviar mais de 32768 Bytes de uma vez?
2) Eu tenho de fazer solução alternativa?
3) Em caso afirmativo, gostaria de dividir os dados, mas como você faz isso? E como o outro soquete saber quando todos os dados são enviados?

A propósito, depois de enviar esta instância NSData única ambos os soquetes devem ser fechados novamente.

Foi útil?

Solução

A quantidade de dados enviados de cada vez depende do tamanho da memória tampão que as estruturas subjacentes e bibliotecas de usar. Embora possa ser configurável, é em grande parte irrelevante. A vantagem do TCP é que ele quer garantias para entregar seus dados (em um ou mais pacotes) ou falhar graciosamente.

  1. Você não tem que dividir seus dados antes de enviar. O sistema subjacente vai fazer isso por você.
  2. no fim de recepção você pode ler os dados disponíveis, então espere até que mais bytes chegarem, processá-los, e assim por diante, até que está disponível há mais dados. Quando da conclusão do remetente de enviar seus dados, ele irá fechar o soquete e o receptor vai ser notificado.

Outras dicas

Seu problema não é com Cacau, mas parece ser um mal-entendido conceitual de stream sockets.

O TCP é um protocolo de fluxo. Os limites de gravações separadas não será mantido.

Se você enviar 32768 bytes, a fim de recepção deve estar preparado para ReadData (ou o que é chamado) para retornar em qualquer lugar de um único byte para 32768 bytes. Se você receber menos de 32768 bytes, então você deve ler novamente para obter o resto. Ou talvez não todo o resto, e você tem que ler novamente. É até você para projetar seu protocolo de rede de modo a fim de recepção sabe quando ele tem todos os dados; por exemplo por prefixar os dados com o seu comprimento.

Se WriteData envia menos do que os dados que você disse para enviar, chamada WriteData novamente com o resto dos dados. E estar preparado para que para também enviar menos do que você pediu.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top