Форум: "Сети";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
ВнизWSAEventSelect Найти похожие ветки
← →
Akni (2003-04-17 13:49) [0]Подскажите, в каком модуле описана функция WSAEventSelect? Подключаю winsock – не помогает. WSAAsyncSelect находит, а WSAEventSelect - нет?
← →
Digitman (2003-04-17 14:02) [1]winsock2.pas
но в станд.поставке Д5 этого модуля нет
const
WINSOCK_VERSION = $0202;
WINSOCK2_DLL = "ws2_32.dll";
interface
function WSAEventSelect( s : TSocket; hEventObject : WSAEVENT; lNetworkEvents : LongInt ): Integer; stdcall;
implementation
function WSAEventSelect; external WINSOCK2_DLL name "WSAEventSelect";
все прочие задействованные декларации/описания есть в станд.хэлпе в Д5
"Winsock2 Programmer"s Reference"
← →
Akni (2003-04-17 16:14) [2]спасибо
← →
Akni (2003-04-17 16:26) [3]простите за глупые вопросы, но как быть с hEventObject : WSAEVENT
Можно ли написать hEventObject : THandle?
← →
Digitman (2003-04-17 16:59) [4]да, можно
← →
AlexMax (2003-04-17 17:34) [5]Вообщето, по моему, эта функция называется WSASelectEvent, а не WSAEventSelect. Так что попробуй этот вариант и старайся повнимательнее хелп смотреть.
← →
Akni (2003-04-17 18:43) [6]Пишу след. код:
var hEventObject: THandle;
procedure TISServerThread.ClientExecute;
...
begin
inherited FreeOnTerminate:=true;
fRecSend:=false;
try
Stream:=TWinSocketStream.Create(ClientSocket, 500);
Res:=WSAEventSelect(ClientSocket.Handle, hEventObject, FD_READ or FD_WRITE);
и получаю на этом месте SocketError 10038
Насколько я понимаю, в качестве парамета s : TSocket указывается хендл сокета, который нужно перевести в неблок. режим. Вот я его вроде бы и беру. hEventObject - просто хендл события, которое наступает при возникновении одного из lNetworkEvents.
В чем тогда моя ошибка?
to AlexMax
Функция называется WSAEventSelect и не по-моему, а точно. Поиск в хелпе WSASelectEvent как раз ничего и не дает
← →
Digitman (2003-04-18 08:33) [7]1.
Res:=WSAEventSelect(ClientSocket. SocketHandle, hEventObject, FD_READ or FD_WRITE);
как инициализируешь hEventObject ? где WSACreateEvent ?
2.
настоятельно не рекомендую использовать класс TWinSocketStream с гнездом , переведенным в неблок.режим для асинхр.нотификаций с использованием AsyncSelect/EventSelect
← →
Akni (2003-04-22 10:33) [8]настоятельно не рекомендую использовать класс TWinSocketStream с гнездом , переведенным в неблок.режим для асинхр.нотификаций с использованием AsyncSelect/EventSelect
почему? а, точнее, какая тогда альтернатива, что использовать?
У меня такие условия задачи:
1. сервер может посылать данные клиенту при возникновении события на сервере
2. клиент посылает серверу запрос, не всегда требующий ответа со стороны сервера
3. код и сервера, и клиента должен быть реализован в отдельном потоке.
Поэтому хочу создать поток с пом. стандартных блокирующих методов и потом перевести его в неблок. режим.
Буду благодарна за лучшие идеи.
← →
Polevi (2003-04-22 10:58) [9]не делай кашу из clientsocket и winsock вызовов, используй или чистый api или TClientSocket
в твоем случае тебя вполне устроит T..Socket в асинхронном режиме (использует WSAAsyncSelect)
← →
Akni (2003-04-22 11:16) [10]т.е. делать отдельный кодовый поток, а в нем создавать TClentSocket / TServerSocket в неблокирующем режиме и использовать стандартные события OnRead, onWrite...
Я правильно поняла идею?
← →
Digitman (2003-04-22 11:37) [11]
> Akni
да, такой вариант ничем не плох
но, конечно же, все зависит от конкретных требований к задаче
механизм асинхр.нотификации с использованием оконных сообщений (неважно, в каком потоке это реализовано) несколько проигрывает по эффективности механизму асинхр.нотификации с использованием объектов синхронизации, но зато программирование работы гнезда в первом случае заметно проще и практически не выходит за рамки обычной обработки VCL-событий (OnRead, OnWrite и т.д.)
← →
Akni (2003-04-22 11:45) [12]> Digitman
Основные требования к задаче я описала выше. Еще одно условие: эта задача - аналог удаленного администрирования, т.е. на одной стороне в одном приложении может создаваться несколько клиентских потоков, каждый из которых соединятеся со своим сервером; а на другой стороне сервер работает, как правило, только с одним клиентом.
Какой механизм лучше использовать в данном случае?
← →
Digitman (2003-04-22 12:07) [13]механизм асинхр.нотификации с использованием оконных сообщений (по умолчанию), думаю, вполне сойдет для такой задачи
так что, скорей всего, нет смысла реализовывать иной механизм
← →
Polevi (2003-04-22 14:18) [14]PS
у механизма асинхр.нотификации с использованием объектов синхронизации есть одна неприятная особенность - ф-ия ожидания может ждать максимум 64 объекта, что не удобно при большом кол-ве клиентов, приходится делать пул потоков
← →
Anatoly Podgoretsky (2003-04-22 14:28) [15]Win+F и найдешь sconnect.pas
WSAEventSelect(s: TSocket; hEventObject: THandle; lNetworkEvents: Integer): Integer stdcall;
A это объявление из winsock2.pas
WSAEventSelect(s: TSocket; hEventObject: WSAEVENT; lNetworkEvents: LongInt): Integer; stdcall;
Учись пользоваться Windows
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.029 c