Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача буфера 8к по сетке [D6, Win2k]


S@shka ©   (2004-03-09 14:16:00) 

Для Digitman> (и остальных)
Передаю с помощью блокируемого TClientSocket
соответственно создал S : TWinSocketStream
и передавал с помощью S.WriteBuffer (Buffer,8192);
и принимал на другой стороне
все вроде бы ничего но загорается лампочка Collision на моем 10-точном хабе - странно :(
Я наткнулся на S.WaitForData () - в хелпе написано использовать для определения готовнисти сокета принимать и писать данные.
Переписал
S.Write (Buffer,4096);
S.WaitForData (100);
....
все нормально - дампочка не горит :)
Но вопрос WaitForData - ладно там для определения пришли данные или нет - но каков принцип работы для процесса отпраавки - и почему тогда эта одна функция.
Спасибо.


Verg   (2004-03-09 16:35:00) [1]

А ведь я не прав!
Че-то тут в хелпах дельфовых не то написано.

Сейчас глянул исходник - WaitForData на самом деле проверяет на наличие принятых данных, а вовсе не

Waits up to Timeout milliseconds for the socket connection to be ready to transfer data.

Так что, пардон, ready to transfer - там такой вообще нет ф-ции.
И значит с размерами передаваемых буферов вообще никакой разницы нет.


Verg   (2004-03-09 15:41:00) [2]


> To Verg >>>
> только ли для готовности передачи??? а прием?
>


Что прием? Read-ом читаешь да и все.


> Вопрос есть ли разница сделать SendBuffer 8192 или кусками
> по 2048 ? например?


Почти никакой. Твои данные TCP (send) просто переписвает в свои буфера и все. Если места в буферах нет, то send будет висеть (заблокирует) до появления этого места или до разрыва соединения. По сути WaitForData и ждет всего лишь появления этого места в передающих буферах TCP.
Как бы WaitForData перед отправкой уменьшает вероятность того, что send заблокируется. Но с другой стороны, если ты при этом send-ишь слишком длинный блок данных, то send может заблокироваться все равно.
Т.о. меньший размер буфера немного предпочтительней.
Я бы назвал это нюансом, а не принципиальной разницей.
Особенно в остутствии в виндовых сокетах такой опции, как SO_SNDLOWAT.


S@shka   (2004-03-09 15:24:00) [3]

Или в самой сетке. Потому как включив два этих компа
в другой хаб (пустой) коллизий не наблдюдается.

To Verg >>>
только ли для готовности передачи??? а прием?

Вопрос есть ли разница сделать SendBuffer 8192 или кусками по 2048 ? например?


Verg   (2004-03-09 14:38:00) [4]

WaitForData нужен для ожидания готовности сокета к передаче данных. И все. Больше ни для чего.

Т.е. в твоем случае нужно писать

if S.WaitForData(тайм-аут) then
begin
 S.Write(Buffer, 4096);
end;


Digitman   (2004-03-09 14:34:00) [5]


> каков принцип работы для процесса отпраавки


никакого отношения ни к "процессу отправки" ни к "лампочке" внутренний алгоритм этого метода не имеет

у тебя где-то ошибка в программе


Наверх

Титульная страница Поиск, карта сайта Написать письмо