Pregunta

Hola chicos, no sé si esta pregunta se ha hecho todavía, pero imaginar siguiente situación:

Tengo dos sockets TCP-(se abre a NSSocketPort und escuchando con dos NSFileHandle) y ahora quieren enviar algo de NSData entre ellos.

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

Todo está bien hasta que quiero enviar una instancia NSData con más de una longitud de 32768 Bytes. Más de este número de bytes no será transferido. Así que aquí están mis preguntas:

1) ¿Por qué no es capaz de cacao enviar más de 32768 Bytes a la vez?
2) ¿Tengo que hacer solución?
3) En caso afirmativo, sin dividir los datos, pero ¿cómo hacerlo? Y cómo sería la otra toma saber cuándo se envía todos los datos?

Por cierto, después de enviar este caso NSData solo dos tomas debe ser cerrado de nuevo.

¿Fue útil?

Solución

La cantidad de datos enviados a la vez depende del tamaño de la memoria intermedia que los marcos y bibliotecas subyacentes utilizan. Si bien puede ser configurable, es sobre todo irrelevante. La ventaja del TCP es que, o bien garantiza para entregar sus datos (en uno o más paquetes) o no con gracia.

  1. Usted no tiene que dividir los datos antes de enviarlos. El sistema subyacente lo hará por usted.
  2. En el extremo receptor puede leer los datos disponibles, y luego esperar hasta que lleguen más bytes, proceso, y así sucesivamente, hasta que no hay más datos disponibles. Cuando el remitente se completa el envío de sus datos, que cerrará el zócalo y el receptor recibirá una notificación.

Otros consejos

Su problema no es con cacao, pero parece ser un malentendido conceptual de sockets de flujo.

TCP es un protocolo de corriente. No se mantienen los límites de las escrituras separadas.

Si envía 32768 bytes, el extremo receptor debe estar preparado para ReadData (o como se llame) para volver en cualquier lugar de un solo byte a 32768 bytes. Si obtiene menos de 32768 bytes, entonces usted debe leer de nuevo para obtener el resto. O tal vez no todo el resto, y usted tiene que leer una vez más. Le toca a usted para diseñar el protocolo de red de modo que el extremo receptor sabe cuando consiguió todos los datos; por ejemplo prefijando los datos con su longitud.

Si WriteData envía menos de los datos que le dijo que para enviar, llame WriteData de nuevo con el resto de los datos. Y estar preparados para que para enviar también menos de lo que pidió.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top