Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.065 c
2-1270824697
aalleexxaa
2010-04-09 18:51
2010.08.27
записать все содержимое базы данных Access в массивы


15-1274808723
Lyonux
2010-05-25 21:32
2010.08.27
Работа сайта


15-1264749431
Делфиец
2010-01-29 10:17
2010.08.27
Помогите разобраться что это за ерунда


13-1125398405
Cherrex
2005-08-30 14:40
2010.08.27
WIN и VCL


15-1263850233
Юрий
2010-01-19 00:30
2010.08.27
С днем рождения ! 19 января 2010 вторник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский