Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.23;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.049 c
1-1142435581
Sergg
2006-03-15 18:13
2006.04.23
Добавление новых членов класса в TTreeView


2-1144751733
speed
2006-04-11 14:35
2006.04.23
Delphi &amp; Access


2-1144683994
эксперт
2006-04-10 19:46
2006.04.23
соединение


2-1144303276
MiHoY
2006-04-06 10:01
2006.04.23
TServerSocket


2-1144223180
Daimyo
2006-04-05 11:46
2006.04.23
помогите выбрать БД