Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Push flag для TCustomWinSocket

61K
13 июня 2010 года
YarMagistr
2 / / 13.06.2010
При пересылке данных через TClientSocket и TServerSocket сообщения "склеиваются". Например, вот такой код:
 
Код:
ClientSocket->Socket->SendText( "1" );
ClientSocket->Socket->SendText( "2" );

Передаст не два, а одно сообщение на другую сторону соединения. Сервер получит "12".

Подскажите, как избежать этой проблемы и заставить сообщение отправляться принудительно?
1
13 июня 2010 года
kot_
7.3K / / 20.01.2000
Ну а сейчас у вас оно что - по собственному желанию отправляет чтоли?
Отправляйте на сервере уведомление клиенту о том что данные получены, а на клиенте - ожидайте подтверждения, а только потом отправляйте следующую. Либо введите разделитель какой нибудь. Либо по человечески сформулируйте свою задачу.
61K
13 июня 2010 года
YarMagistr
2 / / 13.06.2010
Цитата:
Ну а сейчас у вас оно что - по собственному желанию отправляет чтоли?


Сейчас все сообщения собираются в TCP-пакеты, которые отправляются на удаленный компьютер. При этом для оптимизации работы с сетью каждый новый байт, который требуется отправить, добавляется в буфер отправки. Когда в буфере набирается достаточно информации или какое-то время в него ничего не поступает, из буфера формируется пакет и уходит в сеть.
Концепция TCP предполагает управляющие флаги, которые влияют на отсылку и получение. И среди этих флагов есть PUSH, который говорит, что прямо сейчас надо взять все данные из буфера, сформировать из них пакет и немедленно отослать его. Это теория.

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

Цитата:
Отправляйте на сервере уведомление клиенту о том что данные получены, а на клиенте - ожидайте подтверждения, а только потом отправляйте следующую. Либо введите разделитель какой нибудь.


Спасибо, но реализовывать такой велосипед - это неприемлемо. Есть стандартный механизм, и я уверен, Builder дает возможность им пользоваться в своих классах... Только вот как? :confused:

Цитата:
Либо по человечески сформулируйте свою задачу.


Я надеялся, что после слов "push flag" ничего больше пояснять не придется.

1
13 июня 2010 года
kot_
7.3K / / 20.01.2000
Я могу конечно ошибаться - но ИМХО используя билдеровскую надстройку над АПИ у вас подобной возможности нет. По крайней мере я не знаю способа, как используя компоненты билдера установить необходимые флаги для работы с сокетами.
В общем то поэтому, я никогда и не использовал данные компоненты в работе. Если вам это надо - то вероятно ожидание ответа от сервера - это то, что вам нужно. Либо введение разделителей. В данном случае это не "велосипед" - так как вы реализуете именно логику приложения.
1
13 июня 2010 года
kot_
7.3K / / 20.01.2000
Цитата: YarMagistr

Я надеялся, что после слов "push flag" ничего больше пояснять не придется.


приведенный вами код - более чем полностью является [COLOR="Gray"]быдлокодом[/COLOR] индийским. Потому ваши надежды безосновательны.
Как раз таки - использование флагов при этом является чистой воды развитием этого подхода.

332
15 июня 2010 года
Valiant
416 / / 27.09.2004
Цитата: YarMagistr

Подскажите, как избежать этой проблемы и заставить сообщение отправляться принудительно?



К примеру отправлять по таймеру ... или копить в буфере приложения до достижения определённой длины или по прошествии таймаута и отправить ...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог