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

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

Indy10 и условный акцепт соединений [D7, NT4, Win2k, WinXP]


Сергей М. ©   (2008-09-18 17:26:00) 

По возникшей необходимости прикрутил к индейским  TCP-серверным компонентам функциональность conditional acceptance для в виндового стека.

Работает, как известно, только на платформах не ниже NT4.

Кому надо для дела, могу поделиться.


Eraser   (2008-09-22 01:47:00) [1]

> [7] Rouse_ ©   (19.09.08 16:52)


> до сих пор 98-ой поддерживаем (уже умучались в доску, ессчесно...)
> .

аналогично, но т.к. в Д2009 полностью убрали поддержку 9x (если не на чистом API писать конечно), то теперь можно с чистой совестью смело класть болт на эту платформу :-)


Rouse_   (2008-09-19 17:15:00) [2]

Соглашусь, удобно :)
Также полностью соглашусь с этим высказыванием:

> Впрочем, только идиоту придет в голову мысль использовать
> маздайную (95/98/Me) линейку в кач-ве серверной)

Но иногда блин нужно, причем через не-могу, вот и приходится писать свое, а-ля рукотворный ConditionalAccept (который запущается по факту не сработки setsockopt) :)


Сергей М.   (2008-09-19 17:07:00) [3]


> если не отработает setsockopt (не помню от чего зависит),
>  то просто @ConditionProc не будет учитываться при вызове
> WSAAccept и все опять-же нормально сработает


Дык весь и смысл в вызове ConditionProc ..

Не странно ли, что индейские отцы ни в 9-ке ни в 10-ке не задействовали эту крайне нужную фичу хотя бы для виндового стека ? Видимо, они все же руководствовались таки соображениями совместимости, в т.ч. с маздайной линейкой ..

А ведь как, согласись, удобно : шлепнул на форму индейский TCP-сервер в любой его ипостаси, назначил обработчик OnConditionalAccept - и вуаля !


Rouse_   (2008-09-19 16:55:00) [4]

Забыл добавить... речь шла про 98 SE конечно :)


Rouse_   (2008-09-19 16:52:00) [5]


> Сам пробовал ?

Да конечно... Я кусок кода с боевого сервера вытащил, а мы до сих пор 98-ой поддерживаем (уже умучались в доску, ессчесно...).
Там интересная чтука еще есть, если не отработает setsockopt (не помню от чего зависит), то просто @ConditionProc не будет учитываться при вызове WSAAccept и все опять-же нормально сработает, единственно в моем случае не будет вызвано событие FConnecting, а так клиент нормально заакцептиться...


Сергей М.   (2008-09-19 16:24:00) [6]


> Rouse_


Возможно, дело в каких-то сервиспаках/релизах, коснувшихся WS2_32 в этой части и которые у меня отсутствовали в системе на тот момент


Сергей М.   (2008-09-19 16:21:00) [7]


> Rouse_ ©   (19.09.08 15:47) [4]


Сам пробовал ?

Мои потуги многолетней давности на эту тему не привели к успеху - попытка установить опцию гнезда SO_CONDITIONAL_ACCEPT на Win98 исправно приводила к отказу с диагностикой INVALID OPTION.

Перепроверить это сейчас, к сож., нет возможности.

Впрочем, только идиоту придет в голову мысль использовать маздайную (95/98/Me) линейку в кач-ве серверной)


Rouse_   (2008-09-19 15:47:00) [8]


> Работает, как известно, только на платформах не ниже NT4.

На 98-ом очень даже не плохо работает ;)


Rouse_   (2008-09-19 15:45:00) [9]


> а как это?
> В чем выражается

Примерно так:

 // При попытке соединения даем возможность проверить какие либо параметры
 function ConditionProc(lpCallerId: LPWSABUF; lpCallerData: LPWSABUF;
   lpSQOS, lpGQOS: LPQOS; lpCalleeId, lpCalleeData: LPWSABUF;
   g: DWORD; dwCallbackData: DWORD ): Integer; stdcall;
 var
   ClientIP: String;
   zPort: Word;
   CanConnect: Boolean;
 begin
   ClientIP := inet_ntoa(PSockAddrIn(lpCallerId.buf).sin_addr);
   zPort := htons(PSockAddrIn(lpCallerId.buf).sin_port);
   Result := CF_ACCEPT;
   CanConnect := True;
   if Assigned(TGSServerSocket(dwCallbackData).FConnecting) then
     TGSServerSocket(dwCallbackData).FConnecting(nil, ClientIP, zPort, CanConnect);
   if not CanConnect then
     Result := CF_REJECT;
 end;

...

       Size := SizeOf(FAccept);
       Opt := 1;
       setsockopt(FServer, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, @Opt, SizeOf(Opt));
       Client := WSAAccept(FServer, @FAccept, @Size, @ConditionProc, Integer(Self));
       if Client = INVALID_SOCKET then
       begin
         Error(WSAGetLastError,
           'TGSCustomServerSocket.GSocketWndProc > FD_ACCEPT [WSAAccept = INVALID_SOCKET]');
         Exit;
       end;

...


Сергей М.   (2008-09-19 14:35:00) [10]

http://citforum.yspu.yar.ru/programming/delphi/sockets-2/

см. все касаемое WSAAccept


Vlad Oshin   (2008-09-19 14:27:00) [11]

а как это?
В чем выражается


Наверх

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