Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
Новичек   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.047 c
15-1194596998
turbouser
2007-11-09 11:29
2007.12.09
Штрихкод


15-1194552152
@!!ex
2007-11-08 23:02
2007.12.09
Политики тупят...


15-1194314117
Акакий
2007-11-06 04:55
2007.12.09
Как Вы обычно называете переменные типа :


2-1195042234
Nightmare
2007-11-14 15:10
2007.12.09
XML


2-1194789862
SveTTT
2007-11-11 17:04
2007.12.09
Переменная в переменную





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский