-
В WinSock2 появились новые функции - WSARecv и WSASend.
Как я понимаю, кроме кроссплатформенности они ничем не лучше старых ReadFile и WriteWile.
Просьбы высказать мысли по этому поводу.
Имеются ли какие-то преимущества у новых функций?
-
PS. Использую перекрытый ввод/вывод с IOCP.
-
> кроме кроссплатформенности
Какая к лешему "кроссплатформенность", если WinSock ?)
-
> Сергей М. © (30.10.09 00:19) [2]
> > кроме кроссплатформенностиКакая к лешему "кроссплатформенность",
> если WinSock ?)
-)
Ну да. сорри.
Кроссплатформенностью с дуру назвал разные версии winddows.
-
И всё же?
-
> с дуру
Пишется слитно.
> И всё же?
На параметр lpFlags поглазей)
-
> назвал разные версии winddows
Все версии новее 3.11 так или иначе поддерживают WS2.
-
> На параметр lpFlags поглазей)
А он для семейства протоколов TCP имеет значение?
-
Имеет.
Не только, но и в том числе.
-
Судя по MSDN, флаг lpFlags может быть комбинацией из трёх бит:
MSG_PEEK
MSG_OOB
MSG_PARTIAL
Для поточно-ориентированных сокетов остаётся только MSG_PEEK и MSG_OOB.
Конечно, это плюс к WSARecv.
Спасибо за наводку.
Есть ли кроме этого плюсы?
-
> Есть ли кроме этого плюсы?
А разве этого не достаточно ?
Ведь Read/WriteFile[Ex] не даст тебе такой функциональности, если она требуется..
-
> Сергей М. © (30.10.09 12:52) [10]
> > Есть ли кроме этого плюсы?А разве этого не достаточно
> ?Ведь Read/WriteFile[Ex] не даст тебе такой функциональности,
> если она требуется..
Спасибо, Сергей.
Как раз вот на эту инфу с флагом не обратил внимания.
-
И опять же касаемо кроссплатформенности - как раз по этим соображениям не следует пользовать ни WSA-функции ни Read/WriteFile.
Только send[to]/recv[from] - они обязаны присутствовать на любой платформе, поддерживающей базовую функциональность гнезд Беркли.
-
> Сергей М. © (30.10.09 13:03) [12]
> И опять же касаемо кроссплатформенности - как раз по этим
> соображениям не следует пользовать ни WSA-функции ни Read/WriteFile.
>
Ну что касаемо кроссплатформенности - тут у меня проблем нет.
Проект будет работать на платформе Windows.
Поэтому свой выбор сделаю всё-таки в пользу WSA-функций, видимо.
-
WSA позволяют работать с цепочкой буферов, иногда это удобно
-
+ к [14]
WSAAccept позволяет организовать настоящее условное акцептирование запросов на соединение
-
> Polevi © (30.10.09 14:00) [14]
> WSA позволяют работать с цепочкой буферов, иногда это удобно
У меня не будет обмена данными большого размера, планируется обмен короткими пакетами.
На сервере хочу предусмотреть возможность работы под хорошей нагрузкой, поэтому SOCKET IO OVERLAPPED + IOCP.
На клиенте можно попроще - просто SOCKET IO OVERLAPPED.
Конечно, не факт, что сервер будет очень уж популярен, но предусмотреть нужно.
Просто наконец-то взялся за проект, который мечтаю уже 10 лет сделать.
Надеюсь, что наконец-то воплощу в реальность.
-
> Сергей М. © (30.10.09 14:06) [15]
> + к [14]WSAAccept позволяет организовать настоящее условное
> акцептирование запросов на соединение
WSAAccept я уже реализовал именно таким способом.
Вопрос по этому поводу:
Возможно ли на этом уровне уменьшить угрозу от SYN-атак?
-
PS.
Обнаружил ошибки в портированном WINSOCK2.PAS от Алексея Коншина...
-
Я использую его модуль, проблем не было
-
> Polevi © (30.10.09 14:20) [19]
> Я использую его модуль, проблем не было
Проблема возникла при реализации WSAAccept с LPCONDITIONPROC.
-
> Возможно ли на этом уровне уменьшить угрозу от SYN-атак?
Нет.
Этим должен заниматься файрвол.
-
В winsock2.pas:
function WSAAccept( s : TSocket; addr : TSockAddr; addrlen : PInteger; lpfnCondition : LPCONDITIONPROC; dwCallbackData : DWORD ): TSocket; stdcall;
TSockAddrIn = packed record
case Integer of
0: (sin_family : u_short;
sin_port : u_short;
sin_addr : TInAddr;
sin_zero : array[0..7] of Char);
1: (sa_family : u_short;
sa_data : array[0..13] of Char)
end;
PSockAddrIn = ^TSockAddrIn;
TSockAddr = TSockAddrIn;
PSockAddr = ^TSockAddr;
SOCKADDR = TSockAddr;
SOCKADDR_IN = TSockAddrIn;
Вот так работает:
function WSAAccept(
s: TSocket;
addr:PSockAddr;
addrlen: PInteger;
lpfnCondition: LPCONDITIONPROC;
dwCallbackData: DWORD): TSocket; stdcall; external 'ws2_32.dll';
А описание структур взял из стандартного winsock.pas.
-
Всего-то один параметр...
-
> Сергей М. © (30.10.09 14:25) [21]
> > Возможно ли на этом уровне уменьшить угрозу от SYN-атак?
> Нет.Этим должен заниматься файрвол.
Понятно. Значит не буду этим заморачиваться...
-
> Всего-то один параметр
Ну бывают маленькие неприятности, куда ж без них)
-
> > Всего-то один параметрНу бывают маленькие неприятности,
> куда ж без них)
Ага... а я полдня бился над WSAAccept -))
-
Эх, если бы знать, что это единственный недочёт...
-
> я полдня бился над WSAAccept
Я встроил его в TIdCustomTCPServer за час.
Лажа с параметром всплыла и была исправлена при первом же тестовом прогоне)
-
> Сергей М. © (30.10.09 14:36) [28]
> > я полдня бился над WSAAcceptЯ встроил его в TIdCustomTCPServer
> за час.Лажа с параметром всплыла и была исправлена при первом
> же тестовом прогоне)
А я, к сожалению, впервые использовал WSAAccept и понадеялся на портированный модуль, искал у себя ошибки.
-
Ну выскажи Коншину своё "фи", если тебе от этого полегчает)