|
|
|||||
Регистрация: May 2008
Сообщений: 102
|
Socket, склеенные пакеты
код для сокета использую из мануала - http://www.adobe.com/livedocs/flash/...xamplesSummary
при коннекте с серваком, последний сразу шлет клиенту 10 одинаковых пакетов. А вот функция на событие SOCKET_DATA срабатывает только 2 раза - словно приходит 2 пакета. Вот первый: [ProgressEvent type="socketData" bubbles=false cancelable=false eventPhase=2 bytesLoaded=12 bytesTotal=0] [ProgressEvent type="socketData" bubbles=false cancelable=false eventPhase=2 bytesLoaded=108 bytesTotal=0] Если сервер отправляет пакеты с некоторой задержкой - все ок. Если вот сразу кучей - вот такие проблемы. Надо ставить микроскопическую задержку или какой-то разделитель? null например? |
|
|||||
В TCP/IP нет понятия пакета - это потоковый протокол. Пришло все как один вероятно из-за включенного алгоритма нейгла. Все что посылается может приходить абсолютно любыми порциями.
Так что отделять пакеты данных дело рук самого программиста.
__________________
while(1) {} |
|
|||||
Регистрация: May 2008
Сообщений: 102
|
отделять на сервере при отправке или на клиенте?
|
|
|||||
Ну смотри. Представим такой пакет:
- Первый байт - id типа передаваемой сущности - Потом два байта - размер последующих данных пакета - сами данные Алгоритм чтения такой. Если получили три байта или более - читаем заголовок и размер, понимаем сколько байт нужно еще прочитать чтобы полностью составить пакет. После того как пакет прочитан, передаем его кому-то на обработку и разгребаем следующие пришедшие данные.
__________________
while(1) {} |
|
|||||
Регистрация: May 2008
Сообщений: 102
|
спасибо, будем пробовать
|
|
|||||
Цитата:
Вообще говоря TCP/IP - это несколько протоколов разного уровня. И как подсказывает Википедия - пакеты там все таки есть. Другое дело, что как со стороны FP, так, зачастую, и со стороны сервера, мы работаем не с пакетами, а с порциями данных, которые могут состоять из нескольких пакетов
__________________
...вселенская грусть Последний раз редактировалось gloomyBrain; 14.09.2010 в 17:12. |
|
|||||
Регистрация: May 2008
Сообщений: 102
|
Хоть сервак не мой, но походу нет.
|
|
|||||
Когда вы пишете что-то в сокет - данные не отправляются сразу, они какое-то время висят в буфере.
flush очищает данные накопленные в буфере сокета. То есть, грубо говоря, выталкивает их - бегите, мол, ребята, на том конце провода вас ждут. Если делать flush самостоятельно (не дожидаясь пока как-то все само отправится), то шансы на склейку сообщений стремительно падают. Касательно алгоритма Нейгла - так ни разу с ним и не столкнулся, для меня это все еще миф =)
__________________
...вселенская грусть |
|
|||||
Да, я не правильно выразился. Это стек протоколов) Но суть в том что программист ни о каких пакетах в TCP/IP не ведает, а работает с потоком данных. Доставку гарантирует сам протокол, программисту для этого делать ничего не нужно.
Другое дело UDP - вот здесь отсылаются пакеты. Гарантия и порядок доставки ложится на программиста (в сетевых шутерах потери не критичны, так что предпочтительней UDP юзать для сетевого мочилова. TCP/IP будет упорно доставлять в том числе и устаревшие данные)
__________________
while(1) {} Последний раз редактировалось Division; 14.09.2010 в 17:23. |
Часовой пояс GMT +4, время: 19:56. |
|
« Предыдущая тема | Следующая тема » |
|
|