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

Вниз

Indy10 и условный акцепт соединений   Найти похожие ветки 

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

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

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

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


 
Vlad Oshin ©   (2008-09-19 14:27) [1]

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


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

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

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


 
Rouse_ ©   (2008-09-19 15:45) [3]


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

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

 // При попытке соединения даем возможность проверить какие либо параметры
 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;

...



 
Rouse_ ©   (2008-09-19 15:47) [4]


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

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


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


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


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

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

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

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


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


> Rouse_


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


 
Rouse_ ©   (2008-09-19 16:52) [7]


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

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


 
Rouse_ ©   (2008-09-19 16:55) [8]

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


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


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


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

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

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


 
Rouse_ ©   (2008-09-19 17:15) [10]

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

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

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


 
Eraser ©   (2008-09-22 01:47) [11]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.047 c
4-1236677806
Demo_nik
2009-03-10 12:36
2010.08.27
как перехватить функцию копирования


15-1268429405
Юрий
2010-03-13 00:30
2010.08.27
С днем рождения ! 13 марта 2010 суббота


2-1271760916
Irisss
2010-04-20 14:55
2010.08.27
Панель иконок


2-1274676640
viktooor
2010-05-24 08:50
2010.08.27
Запрет редактирование в Grid


15-1266417633
Kerk
2010-02-17 17:40
2010.08.27
Сурков, замруководителя администрации президента, о модернизации