Отправка более 32768 байт одновременно с одного TCP-сокета на другой.

StackOverflow https://stackoverflow.com/questions/2224550

Вопрос

Привет, ребята, я не знаю, задавался ли этот вопрос еще, но представьте себе следующую ситуацию:

У меня есть два TCP-сокета (открытых с помощью NSSocketPort и слушаю вдвоём NSFileHandle) и теперь я хочу отправить несколько NSData между ними.

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

Все в порядке, пока я не хочу отправить NSData экземпляр длиной более 32768 байт.Больше этого количества байтов передаваться не будет.Итак, вот мои вопросы:

1) Почему Cocoa не может отправить более 32768 байт за раз?
2) Нужно ли мне искать обходной путь?
3) Если да, я бы разделил данные, но как бы вы это сделали?И как другой сокет узнает, когда будут отправлены все данные?

Кстати, после отправки этого сингла NSData например, оба сокета должны быть снова закрыты.

Это было полезно?

Решение

Объем данных, отправляемых за раз, зависит от размера буфера, который используют базовые платформы и библиотеки.Хотя это может быть настраиваемо, по большей части это не имеет значения.Преимущество TCP заключается в том, что он либо гарантирует доставку ваших данных (в одном или нескольких пакетах), либо корректно завершает работу.

  1. Вам не нужно разделять данные перед отправкой.Базовая система сделает это за вас.
  2. На принимающей стороне вы можете прочитать доступные данные, затем дождаться поступления новых байтов, обработать их и так далее, пока данные не закончатся.Когда отправитель завершит отправку своих данных, он закроет сокет, и получатель получит уведомление.

Другие советы

Ваша проблема не в Cocoa, а в концептуальном непонимании потоковых сокетов.

TCP — потоковый протокол.Границы отдельных записей не будут сохранены.

Если вы отправляете 32768 байт, принимающая сторона должна быть готова к тому, что readData (или как бы она там ни называлась) вернется куда угодно из один байт до 32768 байт.Если вы получили меньше 32768 байт, вам следует прочитать еще раз, чтобы получить остальное.А может быть не все остальное и придется читать еще раз.Вам предстоит разработать сетевой протокол так, чтобы принимающая сторона знала, когда она получила все данные;например, добавляя к данным префикс их длины.

Если writeData отправляет меньше данных, чем вы указали, вызовите writeData еще раз с остальными данными.И будьте готовы к что также отправить меньше, чем вы просили.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top