![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сообщение через сокет передается не полностью [D7, WinXP]
_Alexander_ © (2005-04-07 14:19:00)Всем привет!
Серверную часть пишу на Делфи. Общий смысл: в потоке создается экземпляр TServerSocket, коннектится к клиенту и отсылает ему данные. В качестве клиента КПК, программа для него написана на C# под VisualStudio.
Когда в качестве тестового сервера была програмулина на C#, общались они нормально. Когда отправляются сообщения из под Делфи, например, так:
Socket.SendText('MyText1');
Socket.SendText('MyText2');
Клиент получает одно сообщение, без первого символа и обрезанное:
yText1MyText2
Это я победил- добавил #9
Socket.SendText('#MyText1');
Теперь каждое сообщение приходит отдельно, но по-прежнему не полностью... Что бы это могло быть?
Verg (2005-04-09 07:01:00) [1]
> Digitman © (07.04.05 15:50) [9]
Пора бы это в лейт-вывеску на входе в форум "сети" повесить...
Digitman (2005-04-07 15:50:00) [2]
> Вобще говоря получается что и длина строки может передаться
> несколькими сообщениями
нет там никаких "сообщений" .. ТСР - это stream-oriented протокол, а не message-oriented (UDP)
сколько доступно на принимающей стороне - тем и довольствуйся
ожидал 10 байт, апрочитал за раз половину ? жди оставшиеся 5 байт ..
ожидал 10 байт, а прочитал за раз больше ? обрабатывай свои ожидаемые и уже полученные 10 байт, остальные относятся к следующему "сообщению" передатчика - буферизуй их и жди очередного фрагмента вх.потока
atruhin (2005-04-07 15:32:00) [3]>>Вобще говоря получается что и длина строки может передаться >>несколькими сообщениями :)
А вот ирония в конце зря. Конечно может.
После установки соединения начинаеш прием данных. Предположим первые 4 байта длинна. Когда считал 4 байта из сокета запоминаешь длинну и читаешь контент. Как дочитал следующие 4 байта опять длинна и т.д.
_Alexander_ (2005-04-07 15:20:00) [4]Вобще говоря получается что и длина строки может передаться несколькими сообщениями :)
Можна конечно ввести свой признак конца строки...
atruhin (2005-04-07 15:15:00) [5]Подскажите плз. как этого избежать.
Никак. Ты используешь потоковое содинение. В начале строки передавай ее длинну
_Alexander_ (2005-04-07 15:12:00) [6]Точнее, судя по тому что я вижу, строки сообщений могут быть соединены или разованы произвольным образом... Подскажите плз. как этого избежать.
_Alexander_ (2005-04-07 14:57:00) [7]Какой вопрос? "Где написано...?" Не владею такой информацией.
Исходя из уточняющего вопроса получается, что если сообщения остылаются одно за другим, то на приемнике это уже одно сообщение?
Digitman (2005-04-07 14:47:00) [8]
> _Alexander_ (07.04.05 14:43) [2]
ты на вопрос не ответил ...
_Alexander_ (2005-04-07 14:43:00) [9]Если сообщения отсылаются сервером написанным на C#, сообщения принимаются каждое отдельно. Отсюда можно сделать вывод, что дело не в отработке приемником событий а то ли в передатчике то ли в формате передаваемых строк
Digitman (2005-04-07 14:30:00) [10]а где написано, что каждая отдельной строке, посланной методом SendText() на стороне передатчика, должно соответствовать отдельное событие OnRead на стороне приемника ?