![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Indy10 и условный акцепт соединений [D7, NT4, Win2k, WinXP]
Сергей М. © (2008-09-18 17:26:00)По возникшей необходимости прикрутил к индейским TCP-серверным компонентам функциональность conditional acceptance для в виндового стека.
Работает, как известно, только на платформах не ниже NT4.
Кому надо для дела, могу поделиться.
Eraser (2008-09-22 01:47:00) [1]> [7] Rouse_ © (19.09.08 16:52)
> до сих пор 98-ой поддерживаем (уже умучались в доску, ессчесно...)
> .
аналогично, но т.к. в Д2009 полностью убрали поддержку 9x (если не на чистом API писать конечно), то теперь можно с чистой совестью смело класть болт на эту платформу :-)
Rouse_ (2008-09-19 17:15:00) [2]Соглашусь, удобно :)
Также полностью соглашусь с этим высказыванием:
> Впрочем, только идиоту придет в голову мысль использовать
> маздайную (95/98/Me) линейку в кач-ве серверной)
Но иногда блин нужно, причем через не-могу, вот и приходится писать свое, а-ля рукотворный ConditionalAccept (который запущается по факту не сработки setsockopt) :)
Сергей М. (2008-09-19 17:07:00) [3]
> если не отработает setsockopt (не помню от чего зависит),
> то просто @ConditionProc не будет учитываться при вызове
> WSAAccept и все опять-же нормально сработает
Дык весь и смысл в вызове ConditionProc ..
Не странно ли, что индейские отцы ни в 9-ке ни в 10-ке не задействовали эту крайне нужную фичу хотя бы для виндового стека ? Видимо, они все же руководствовались таки соображениями совместимости, в т.ч. с маздайной линейкой ..
А ведь как, согласись, удобно : шлепнул на форму индейский TCP-сервер в любой его ипостаси, назначил обработчик OnConditionalAccept - и вуаля !
Rouse_ (2008-09-19 16:55:00) [4]Забыл добавить... речь шла про 98 SE конечно :)
Rouse_ (2008-09-19 16:52:00) [5]
> Сам пробовал ?
Да конечно... Я кусок кода с боевого сервера вытащил, а мы до сих пор 98-ой поддерживаем (уже умучались в доску, ессчесно...).
Там интересная чтука еще есть, если не отработает setsockopt (не помню от чего зависит), то просто @ConditionProc не будет учитываться при вызове WSAAccept и все опять-же нормально сработает, единственно в моем случае не будет вызвано событие FConnecting, а так клиент нормально заакцептиться...
Сергей М. (2008-09-19 16:24:00) [6]
> Rouse_
Возможно, дело в каких-то сервиспаках/релизах, коснувшихся WS2_32 в этой части и которые у меня отсутствовали в системе на тот момент
Сергей М. (2008-09-19 16:21:00) [7]
> Rouse_ © (19.09.08 15:47) [4]
Сам пробовал ?
Мои потуги многолетней давности на эту тему не привели к успеху - попытка установить опцию гнезда SO_CONDITIONAL_ACCEPT на Win98 исправно приводила к отказу с диагностикой INVALID OPTION.
Перепроверить это сейчас, к сож., нет возможности.
Впрочем, только идиоту придет в голову мысль использовать маздайную (95/98/Me) линейку в кач-ве серверной)
Rouse_ (2008-09-19 15:47:00) [8]
> Работает, как известно, только на платформах не ниже NT4.
На 98-ом очень даже не плохо работает ;)
Rouse_ (2008-09-19 15:45:00) [9]
> а как это?
> В чем выражается
Примерно так:
// При попытке соединения даем возможность проверить какие либо параметры
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;
...
Сергей М. (2008-09-19 14:35:00) [10]http://citforum.yspu.yar.ru/programming/delphi/sockets-2/
см. все касаемое WSAAccept
Vlad Oshin (2008-09-19 14:27:00) [11]а как это?
В чем выражается