Главная страница
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.028 c
1-1142347928
Ilg
2006-03-14 17:52
2006.04.23
Выключение вкладок PageControl


2-1144566772
hgd
2006-04-09 11:12
2006.04.23
Graphics 32


15-1143791714
Новичоккк
2006-03-31 11:55
2006.04.23
Вопрос по DLL в Delphi


15-1144126390
Ega23
2006-04-04 08:53
2006.04.23
С Днём рождения! 4 апреля


3-1141321521
ihtiandr
2006-03-02 20:45
2006.04.23
Функция номера записи