Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];

Вниз

Объясните   Найти похожие ветки 

 
boolean   (2002-10-01 09:19) [0]

TServerSocket, TClientSocket.
Я, ради интереса, сделал два приложения с этими компонентами. На клиенте сделал кнопочку по нажатию которой шлю данные методом SendBuffer. Слал килобайт 100. Если я часто нажимал кнопку, на клиенте возникало событие OnWrite.
1. Объясните пожалуйста, когда возникает событие OnWrite на клиенте? И как правильно его отработать.
2. Чем координально отличается посылка методом SendBuffer и SendStream?

Буду очень благодарен


 
Digitman   (2002-10-01 09:44) [1]

OnWrite() фиксирует факт готовности буфера передачи к записи в него данных.

For non-blocking sockets, the data is sent to the WinSock DLL which has it"s own internal buffers. If the WinSock can accept additional data, SendBuf returns immediately with the number of bytes queued. If the WinSock internal buffer space is not able to accept the buffer being sent, SendBuf returns -1 and no data is queued at all. In this case, wait a bit for the WinSock to have a chance to send out already-queued data; then try again.

Вот этот самый try again ты и должен выполнить, если SendBuf вернул -1, по факту возникновения ближайшего же по времени события OnWrite().


 
Digitman   (2002-10-01 09:46) [2]


> Чем к оординально отличается посылка методом SendBuffer и
> SendStream?


К ардинально - ничем. Источник данных просто разный


 
boolean   (2002-10-01 10:33) [3]

Большое спасибо за ответ. Задам еще встречный.

>OnWrite() фиксирует факт готовности буфера передачи к записи в него данных.

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

Если не сложно, не мог бы ты объяснить на пальцах как правильно это событие обработать. (простенький код) Т.е. как правильно организовывать посылку, чтобы не было потери данных. Интересен тот случай, когда буфер приемника переполнен. Мне кажется это многим было бы полезно знать.


 
Polevi   (2002-10-01 10:54) [4]

ну тебе же объяснили уже
если SendBuf вернул -1 или число меньшее колва байт кот. ты хотел послать - жди сообщения OnWrite, и пытайся послать данные снова


 
Digitman   (2002-10-01 11:19) [5]


> Если OnWrite фиксирует факт готовности буфера передачи к
> записи в него данных, то почему он не срабатывает каждый
> раз, когда я отправляю малое количество данных?


Внутренний буфер передачи имеет некий фиксированный размер (по-умолчанию = 8кб). Буфер реализуется внутренним FIFO-механизмом (классическая очередь) Winsock, наполняется с "хвоста" вызовами SendText, SendBuf, SendStream и т.п. и освобождается по мере фактической передачи очередных выбираемых порций данных из "головы". Если требуется постановка в очередь данных, размер которых превышает размер "свободных мест" в тек.состоянии очереди, то send-вызовы (на уровне объекта TCustomWinSocket) возвращают тем или иным образом (зависит от конкретного send-метода) признак отказа : не отказа передачи, а отказа постановки требуемого объема данных в очередь в данный момент ! Если сей факт имел место быть (именно - для неблокирующего режима работы гнездовых транспортных ф-ций), то Winsock фиксирует его во внутренних структурах и, как только очередь будет пуста (т.е. освободится с "головы" полностью), возбуждает событие OnWrite (см. FD_WRITE), извещая о доступности очереди передачи для помещения в ее "хвост" новых порций данных.
Во всех прочих случаях, никогда не вызывающих попытку переполнения очереди, событие OnWrite возникает только однократно - в момент установления коннекта (т.е. сразу же за OnConnect). Именно этим объясняется факт отсутствия более чем одного события OnWrite, когда попытки выполнения различных send-методов производятся достаточно редко и посылаемые таким образом данные не превышают размер свободного "хвоста" очереди передачи.



 
boolean   (2002-10-01 11:54) [6]

спасибо



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
3-82639
Uran
2002-11-06 11:54
2002.11.25
Ограничение прав доступа в IB


14-82971
nick_vstu
2002-11-05 10:32
2002.11.25
Вам нравится група Ленинград?


14-82973
Drova
2002-11-06 23:11
2002.11.25
Что такое WINS ?


3-82595
iNew
2002-11-05 03:58
2002.11.25
В BLOB поле храню фотографии, как сделать чтобы если есть


1-82729
sen
2002-11-15 08:52
2002.11.25
Узнать, какая русская буква нажата





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский