-
По возникшей необходимости прикрутил к индейским TCP-серверным компонентам функциональность conditional acceptance для в виндового стека.
Работает, как известно, только на платформах не ниже NT4.
Кому надо для дела, могу поделиться.
-
а как это? В чем выражается
-
-
> а как это? > В чем выражается
Примерно так: 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;
...
-
> Работает, как известно, только на платформах не ниже NT4.
На 98-ом очень даже не плохо работает ;)
-
> Rouse_ © (19.09.08 15:47) [4]
Сам пробовал ?
Мои потуги многолетней давности на эту тему не привели к успеху - попытка установить опцию гнезда SO_CONDITIONAL_ACCEPT на Win98 исправно приводила к отказу с диагностикой INVALID OPTION.
Перепроверить это сейчас, к сож., нет возможности.
Впрочем, только идиоту придет в голову мысль использовать маздайную (95/98/Me) линейку в кач-ве серверной)
-
> Rouse_
Возможно, дело в каких-то сервиспаках/релизах, коснувшихся WS2_32 в этой части и которые у меня отсутствовали в системе на тот момент
-
> Сам пробовал ?
Да конечно... Я кусок кода с боевого сервера вытащил, а мы до сих пор 98-ой поддерживаем (уже умучались в доску, ессчесно...). Там интересная чтука еще есть, если не отработает setsockopt (не помню от чего зависит), то просто @ConditionProc не будет учитываться при вызове WSAAccept и все опять-же нормально сработает, единственно в моем случае не будет вызвано событие FConnecting, а так клиент нормально заакцептиться...
-
Забыл добавить... речь шла про 98 SE конечно :)
-
> если не отработает setsockopt (не помню от чего зависит), > то просто @ConditionProc не будет учитываться при вызове > WSAAccept и все опять-же нормально сработает
Дык весь и смысл в вызове ConditionProc ..
Не странно ли, что индейские отцы ни в 9-ке ни в 10-ке не задействовали эту крайне нужную фичу хотя бы для виндового стека ? Видимо, они все же руководствовались таки соображениями совместимости, в т.ч. с маздайной линейкой ..
А ведь как, согласись, удобно : шлепнул на форму индейский TCP-сервер в любой его ипостаси, назначил обработчик OnConditionalAccept - и вуаля !
-
Соглашусь, удобно :) Также полностью соглашусь с этим высказыванием:
> Впрочем, только идиоту придет в голову мысль использовать > маздайную (95/98/Me) линейку в кач-ве серверной)
Но иногда блин нужно, причем через не-могу, вот и приходится писать свое, а-ля рукотворный ConditionalAccept (который запущается по факту не сработки setsockopt) :)
-
> [7] Rouse_ © (19.09.08 16:52)
> до сих пор 98-ой поддерживаем (уже умучались в доску, ессчесно...) > .
аналогично, но т.к. в Д2009 полностью убрали поддержку 9x (если не на чистом API писать конечно), то теперь можно с чистой совестью смело класть болт на эту платформу :-)
|