Форум: "Сети";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
ВнизSelect (Socket API) Найти похожие ветки
← →
GanibalLector © (2006-01-10 18:57) [0]Где-то в потоке сервера :
if Select(0,@SetR,@SetW,nil,@Tm)<>0 then
begin
...
if FD_IsSet(Socks[I],SetR) then
begin
// клиент послал данные , надо принять
end else
if FD_IsSet(Socks[I],SetW) then
begin // клиент ждет данных
Val:="Hello,am server";
Send(Socks[I],Val[1],Length(Val),0);
end;
Где-то в клиенте :
WSAStartup
Socket
if Connect(Sock,Addr,SizeOf(TSockAddr))<>SOCKET_ERROR then
begin
// Sleep(50); т.е. какая-то небольшая работа
Send(Sock,PChar("oops")^,5,0);
...
Так вот,если клиент запускается без Sleep, то все отлично работает.Если же в коде присутсвует Sleep,то
на сервере появляется "событие" о ожидании данных клиентом(выделенно жирным). С чего бы это?
З.Ы. На сколько я понял,побороть это невозможно :( Соответсвенно, остается один вариант:
- не ожидать "события" от клиента о приеме данных (т.е. Select(0,@SetR,nil,nil,@Tm)
- от клиента посылать некие спец.символы,которые распознает сервер и начнет некоторые действия.
Прав ли я ???
← →
Digitman © (2006-01-11 08:45) [1]
> Прав ли я ???
не прав.
> if FD_IsSet(Socks[I],SetW) then
> begin // клиент ждет данных
Aакт установленного SetW-флага говорит не о том , что парнер по соединению что-то там ждет, а о готовности буфера передачи гнезда к записи в него данных, требуемых к передаче партнеру по соединению.
Флаг, извещающий об этом событии, устанавливается минимум однократно, сразу после успешного установления соединения с партнером по коннекту.
Кр.того, это флаг устанавливается всякий раз, когда буфер передачи освобождается в результате фактической отправки данных из него партнеру по соединению.
Кто из парнеров сервер, а кто клиент - совершенно неважно, после установления соединения эта грань становится неразличимой, т.е. образуется "виртуальный канал" соединения, концы которого образуют два гнезда, каждое из которых в произвольный момент времени вольно либо передавать либо принимать данные.
← →
GanibalLector © (2006-01-11 09:44) [2]2 Digitman © (11.01.06 08:45) [1]
Хорошо. Ну,а как тогда установить "событие" на ожидание данных???
← →
Digitman © (2006-01-11 09:48) [3]
> как тогда установить "событие" на ожидание данных???
А никак.
Событие не "устанавливается", а возникает.
Если обнаружено, что флаг SetR установлен, то это означает, что от партнера по соединению на этот момент системой приняты некие данные, и есть прямой резон прочитать их из буфера приема вызовом recv-ф-ции
← →
GanibalLector © (2006-01-11 14:49) [4]2 Digitman © (11.01.06 09:48) [3]
>Если обнаружено, что флаг SetR установлен, то это означает, что от партнера по соединению на этот момент системой приняты некие данные, и есть прямой резон прочитать их из буфера приема вызовом recv-ф-ции
Это понятно. А наоборот? Когда клиент,после Connect делает Recv.Могу ли я определить на сервере,что клиенту нужны данные.
← →
Digitman © (2006-01-11 15:06) [5]
> Могу ли я определить на сервере,что клиенту нужны данные
нет, не можешь.
кто из партнеров по соединению, когда и при каких условиях передает, а кто принимает инф-цию, определяется искл-но прикладным протоколом инф.обмена между партнерами
← →
GanibalLector © (2006-01-12 00:55) [6]2 Digitman
Спасибо.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.013 c