![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Select (Socket API)
GanibalLector © (2006-01-10 18:57:00)Где-то в потоке сервера :
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)
- от клиента посылать некие спец.символы,которые распознает сервер и начнет некоторые действия.
Прав ли я ???
GanibalLector (2006-01-12 00:55:00) [1]2 Digitman
Спасибо.
Digitman (2006-01-11 15:06:00) [2]
> Могу ли я определить на сервере,что клиенту нужны данные
нет, не можешь.
кто из партнеров по соединению, когда и при каких условиях передает, а кто принимает инф-цию, определяется искл-но прикладным протоколом инф.обмена между партнерами
GanibalLector (2006-01-11 14:49:00) [3]2 Digitman © (11.01.06 09:48) [3]
>Если обнаружено, что флаг SetR установлен, то это означает, что от партнера по соединению на этот момент системой приняты некие данные, и есть прямой резон прочитать их из буфера приема вызовом recv-ф-ции
Это понятно. А наоборот? Когда клиент,после Connect делает Recv.Могу ли я определить на сервере,что клиенту нужны данные.
Digitman (2006-01-11 09:48:00) [4]
> как тогда установить "событие" на ожидание данных???
А никак.
Событие не "устанавливается", а возникает.
Если обнаружено, что флаг SetR установлен, то это означает, что от партнера по соединению на этот момент системой приняты некие данные, и есть прямой резон прочитать их из буфера приема вызовом recv-ф-ции
GanibalLector (2006-01-11 09:44:00) [5]2 Digitman © (11.01.06 08:45) [1]
Хорошо. Ну,а как тогда установить "событие" на ожидание данных???
Digitman (2006-01-11 08:45:00) [6]
> Прав ли я ???
не прав.
> if FD_IsSet(Socks[I],SetW) then
> begin // клиент ждет данных
Aакт установленного SetW-флага говорит не о том , что парнер по соединению что-то там ждет, а о готовности буфера передачи гнезда к записи в него данных, требуемых к передаче партнеру по соединению.
Флаг, извещающий об этом событии, устанавливается минимум однократно, сразу после успешного установления соединения с партнером по коннекту.
Кр.того, это флаг устанавливается всякий раз, когда буфер передачи освобождается в результате фактической отправки данных из него партнеру по соединению.
Кто из парнеров сервер, а кто клиент - совершенно неважно, после установления соединения эта грань становится неразличимой, т.е. образуется "виртуальный канал" соединения, концы которого образуют два гнезда, каждое из которых в произвольный момент времени вольно либо передавать либо принимать данные.