Конференция "Сети" » Indy10 и условный акцепт соединений [D7, NT4, Win2k, WinXP]
 
  • Сергей М. © (18.09.08 17:26) [0]
    По возникшей необходимости прикрутил к индейским  TCP-серверным компонентам функциональность conditional acceptance для в виндового стека.

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

    Кому надо для дела, могу поделиться.
  • Vlad Oshin © (19.09.08 14:27) [1]
    а как это?
    В чем выражается
  • Сергей М. © (19.09.08 14:35) [2]
    http://citforum.yspu.yar.ru/programming/delphi/sockets-2/

    см. все касаемое WSAAccept
  • Rouse_ © (19.09.08 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_ © (19.09.08 15:47) [4]

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

    На 98-ом очень даже не плохо работает ;)
  • Сергей М. © (19.09.08 16:21) [5]

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


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

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

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

    Впрочем, только идиоту придет в голову мысль использовать маздайную (95/98/Me) линейку в кач-ве серверной)
  • Сергей М. © (19.09.08 16:24) [6]

    > Rouse_


    Возможно, дело в каких-то сервиспаках/релизах, коснувшихся WS2_32 в этой части и которые у меня отсутствовали в системе на тот момент
  • Rouse_ © (19.09.08 16:52) [7]

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

    Да конечно... Я кусок кода с боевого сервера вытащил, а мы до сих пор 98-ой поддерживаем (уже умучались в доску, ессчесно...).
    Там интересная чтука еще есть, если не отработает setsockopt (не помню от чего зависит), то просто @ConditionProc не будет учитываться при вызове WSAAccept и все опять-же нормально сработает, единственно в моем случае не будет вызвано событие FConnecting, а так клиент нормально заакцептиться...
  • Rouse_ © (19.09.08 16:55) [8]
    Забыл добавить... речь шла про 98 SE конечно :)
  • Сергей М. © (19.09.08 17:07) [9]

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


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

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

    А ведь как, согласись, удобно : шлепнул на форму индейский TCP-сервер в любой его ипостаси, назначил обработчик OnConditionalAccept - и вуаля !
  • Rouse_ © (19.09.08 17:15) [10]
    Соглашусь, удобно :)
    Также полностью соглашусь с этим высказыванием:

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

    Но иногда блин нужно, причем через не-могу, вот и приходится писать свое, а-ля рукотворный ConditionalAccept (который запущается по факту не сработки setsockopt) :)
  • Eraser © (22.09.08 01:47) [11]
    > [7] Rouse_ ©   (19.09.08 16:52)


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

    аналогично, но т.к. в Д2009 полностью убрали поддержку 9x (если не на чистом API писать конечно), то теперь можно с чистой совестью смело класть болт на эту платформу :-)
 
Конференция "Сети" » Indy10 и условный акцепт соединений [D7, NT4, Win2k, WinXP]
Есть новые Нет новых   [134432   +19][b:0][p:0.001]