Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.09;
Скачать: CL | DM;

Вниз

Обработка событий от нескольких сокетов.   Найти похожие ветки 

 
Новичек   (2007-11-15 12:11) [0]

Здравствуйте, уважаемые Знатоки.
Имеется несколько потоков, в каждом из которых создается сокет.
Обработка событий от сокетов осуществляется с помощью вызова WSAAsyncSelect(sctSocket, frmMain.Handle, WM_sctSocketEvent, FD_Read);
Обработчик выглядит следующим образом:
procedure TfrmMain.WMsctSocketEvent(var Msg: TMessage);
var
 LenOfBuf: Cardinal;
Local: AnsiString;
begin
 case WSAGetSelectEvent(Msg.lParam) of
   FD_Read:
   begin
      ioctlsocket(WorkedSocket, FIONREAD, LenOfBuf);
      SetLength(Local, LenOfBuf);
      Recv(sctSocket, PChar(Local)^, LenOfBuf, 0);
      if Pos(IniString1, Local) <> 0 then
      begin
        SendStr(sctSocket, Answer1 + #13#10);
        Exit;
      end;
      if Pos(IniString2, Local) <> 0 then
      begin
        SendStr(sctSocket, Answer2 + #13#10);
        Exit;
      end;
    end;// FD_Read
  end;// case
end;

Процедура SendStr отсылает указанную строку на указанный сокет.
Теперь сам вопрос: если в этот обработчик будут поступать данные из множества сокетов, то на какой сокет будет отправлять данные процедура SendStr?
Спасибо.


 
Vice____   (2007-11-15 12:27) [1]

а самому проверить...
хотя думаю ето только первый вопрос)


 
Сергей М. ©   (2007-11-15 12:29) [2]


> Recv(sctSocket, PChar(Local)^, LenOfBuf, 0);


Кто такой sctSocket ?


 
Новичек   (2007-11-15 12:33) [3]

2Vice____:
Нет возможности, т.к. сокеты на работе, а я там буду только после 20:00.

2Сергей М.:
sctSocket типа TSocket


 
Сергей М. ©   (2007-11-15 12:35) [4]


> sctSocket типа TSocket
>


Я тебя не спрашиваю про тип)
Ежу понятно, что это хэндл гнезда.

Я спрашиваю - какого конкретно гнезда ? Т.е. где эта переменная объявлена, при каких условиях и как она иниц-ся значением хэндла этого гнезда ?


 
Новичек   (2007-11-15 12:40) [5]

2Сергей М.:
Прошу прощения, не понял сразу.
Сокет объявлен глобально, инициализируется в каждом потоке.


 
Сергей М. ©   (2007-11-15 12:43) [6]


> Новичек   (15.11.07 12:40) [5]


Ну и как, по-твоему, одна и та же переменная будет хранить хендлы нескольких гнезд одновременно ?


 
Новичек   (2007-11-15 12:46) [7]

2Сергей М.:
Я так понимаю, следует организовать массив сокетов?


 
Сергей М. ©   (2007-11-15 12:47) [8]

Следует или не следует - решать тебе.
Но решение, описанное тобой в [5], откровенно ошибочное.


 
Новичек   (2007-11-15 12:50) [9]

Понял. Спасибо, сударь, за указание, куда копать :)


 
Vice____   (2007-11-15 13:10) [10]


> Новичек   (15.11.07 12:50) [9]

насмелюсь сказать:)
а может копнуть в сторону компонентов и избавится от потоков, хотя смотря какая там задача


 
Новичек   (2007-11-15 13:31) [11]

2Vice____:
Задача такая: следует опросить несколько терминалов (по телнету), количество которых заранее неизвестно. Потоки выбрал из-за того, что с их помощью можно организовать опрос сразу всех терминалов. Ежели есть другие идеи - приму с благодарностью.


 
Сергей М. ©   (2007-11-15 14:01) [12]


> Новичек


Чем готовые компоненты не угодили ?


 
Новичек   (2007-11-15 14:07) [13]

2Сергей М.:
Почему не угодили? Очень даже угодили. Я написал версию с Indy, версию с ICS, версию с Synapse - все версии работают безукоризненно.
А теперь хочется что-то и ручками сделать.


 
Сергей М. ©   (2007-11-15 14:16) [14]


> теперь хочется что-то и ручками сделать


Ну так сделай по образу и подобию тех компонентов, которые "работают безукоризненно").. Они же все с исх.текстами)... Что мешает изучить эти тексты на предмет как вся эта кухня правильно реализуется ?


 
Новичек   (2007-11-15 14:24) [15]

Блин, ADSL все время рвется...

> Ну так сделай по образу и подобию тех компонентов, которые
> "работают безукоризненно")..

С этим проблем нет.
Дело в другом. Я давно и успешно использую WSA. Трудность появилась при решении опросить сразу все терминалы (чтоб быстрей было) с использованием API.
Вдобавок, с WSA напрямую гораздо проще работать (по крайней мере, для меня).


 
Сергей М. ©   (2007-11-15 14:26) [16]


> опросить сразу все терминалы (чтоб быстрей было)


Так ты же не сразу их опрашиваешь, а последовательно)


 
Новичек   (2007-11-15 14:35) [17]


> Так ты же не сразу их опрашиваешь, а последовательно)

Именно сразу - создал кучу потоков, в них делается все остальное.
Вот только никак не дойдет до меня, как проще сделать обработку поступающих данных. Ведь объявить обработчик событий от одного сокета можно лишь раз, а как в нем потом разделить сокеты? Смутное предчуствие, что как-то это можно реализовать, у меня есть. Ведь не зря же в WSAAsyncSelect передается хэндл сокета.


 
Сергей М. ©   (2007-11-15 14:42) [18]


> Ведь не зря же в WSAAsyncSelect передается хэндл сокета


Конечно не зря.
Впоследствии он будет фигурировать в Msg.wParam.


>
> Именно сразу


Ну где же "сразу" ?

Ты указал одно и то же окно одного и того же потока в качестве адресата сообщений о событиях в нескольких гнездах.

Оконные сообщения поток-владелец окна-адресата будет выбирать/обрабатывать по одному последовательно ,  в порядке их следования в очереди сообщений.


 
Новичек   (2007-11-15 14:47) [19]


> Ты указал одно и то же окно одного и того же потока в качестве
> адресата сообщений о событиях в нескольких гнездах.

Угу, верно, я и не спорю.
А как же все-таки реализовать обработку? Было бы неплохо из каждого потока посылать сообщение, но заранее неизвестно, сколько писать обработчиков :(
Вот и сижу, голова крУгом.


 
Новичек   (2007-11-15 15:01) [20]

Ухожу ненадолго, зайду позже.


 
Сергей М. ©   (2007-11-15 15:09) [21]


> как же все-таки реализовать обработку?


Использовать в кач-ве адресата окно того потока, который работает с интересующим гнездом.

Только вся эта асинхронная кухня здесь вряд ли нужна.

Ведь что такое "опрос терминала" ?

Как я понимаю, это отправка запроса + ожидание и получение ответа на этот запрос (возможно с последующей обработкой данных ответа). Если это так и если поток, создавший гнездо, кроме изложенного более ничем не занимается, нет никакого резона в транспорте с асинхронными нотификациями. Поток просто создает гнездо (создается оно всегда с опцией блок.режима ввода/вывода), после чего отправляет запрос и ждет ответ:

WSACheckResult(send(hSocket, sendbuf , ..);
WSACheckResult(recv(hSocket, recvbuf, ...);
ProcessResult(recvbuf, ..);


 
Anatoly Podgoretsky ©   (2007-11-15 15:45) [22]

> Новичек  (15.11.2007 14:47:19)  [19]

Посмотри реализацию ICS он работает с десятками тысяч сокетов в одном потоке и у него нет проблем с определением сокета, работает как раз через WSocket



Страницы: 1 вся ветка

Текущий архив: 2007.12.09;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.021 c
15-1194337973
Evanescence
2007-11-06 11:32
2007.12.09
Кажется, я убил вирус :)


11-1181305391
=BuckLr=
2007-06-08 16:23
2007.12.09
PStrList и Юникод


15-1194602578
Z@ichik
2007-11-09 13:02
2007.12.09
Преобразование Аксельмана


6-1175434020
Lyberzon
2007-04-01 17:27
2007.12.09
Как отправить на печать документ из TWebBrowser?


2-1194729603
sdaf
2007-11-11 00:20
2007.12.09
иконки в систем трэй