Форум: "Сети";
Текущий архив: 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.08 c