Как CFReadStreamRead распознает пакеты при чтении? - PullRequest
0 голосов
/ 20 февраля 2012

Я чувствую, что мне не хватает какой-то фундаментальной информации, однако проблема, с которой я сталкиваюсь, заключается в том, что я получаю один пакет данных, который состоит из двух объединенных других пакетов.Серверный API работает правильно, это объединение происходит только тогда, когда происходит несколько операций записи и чтения одновременно.Итак, вопрос в том, выполняет ли сервер несколько операций записи через сокет, кто отвечает за определение того, где начинается, заканчивается пакет и где начинается второй пакет?Я или CFReadStreamRead?

В настоящее время я использую AsyncSocket, который является оболочкой для CFNetwork, но ИМХО проблема как-то связана с самим CFReadStreamRead: иногда он читает два пакета как один, а не читает их отдельно.Мне не удалось найти относительные примеры и информацию о том, как протекает поток, когда происходит несколько операций записи и чтения одновременно, и нужно ли мне явно что-то делать, чтобы захватить пакет, или мне нужно вручную отделить эти пакеты от поступающего потока данных?Хотя CFReadStreamRead уже делает это, но, возможно, мне не хватает чего-то.

1 Ответ

1 голос
/ 20 февраля 2012

Непонятно, что вы подразумеваете здесь под «пакетами», и я подозреваю, что вы используете этот термин очень свободно.Место, в котором определяются границы пакетов (то есть IP-пакетов), находится на сетевом уровне, который значительно ниже любой из вещей, о которых вы говорите.

На уровне, о котором вы говорите, все записисобираюсь объединиться.Байты - это байты.Одна запись ни в коем случае не предполагает одно чтение.Многократные записи могут отображаться на одно чтение или наоборот.Протокол должен указать, где находятся границы между вещами, которые протокол рассматривает как отдельные сообщения.В описываемой вами ситуации это означает, что это проблема между вами и вашим сервером.

...