Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ClientSocket -- получение ответа на запрос [D7, WinXP]


Страницы:   1 2

Ypbi4 ©   (2007-04-23 13:53:00) 

Добрый весна всем :)
Есть проблемка интересная:
Через Clientsocket  в режиме ctNonBlocking отправляется запрос на сервер  и с него получаю ответ, этот ответ нужно обработать. Вроде ничего сложного, но есть запарка: нужно отправить несколько параметров и от каждого получить ответ, верный он или нет(верный то содержит в ReciveText 250 ok нет 500 Error). и такх запросов за один сеанс порядка 12000. Я реализовал ето так:
Создал поток thread  и заключил в него процедуры
           MainForm.SNPP.Socket.SendText('PAGER'+' '+tel+#10);
           sleep(time2); // задержка что бы  дождаться данных
           recive:=MainForm.SNPP.Socket.ReceiveText;
           if POS('250',recive) = 0 then // если не принято, то пишется ошибка
             Begin
               zapis:='Неверный формат номера'+#10#13+recive;
               MainForm.SNPP.Socket.SendText('RESET'+#10);
               synchronize(UpdateMemo);
             end;
Дело в том что это занимает очень много времени, может как то можно ускорить процесс обмена :( И данные могут склеиваться т.е. может прийти ответ на пару запросов.
На сайте в FAQ нашел пример похожий но это не то :(

 s:= Socket.ReceiveText;
 // Если мы не в режиме приёма:
 if not Reciving then
 begin
   // Теперь нам необходимо получить длину потока данных.
   SetLength(sl, StrLen(PChar(s))+1); // +1 for the null terminator
   StrLCopy(@sl[1], PChar(s), Length(sl)-1);
   DataSize:= StrToInt(sl);
   Data:= TMemoryStream.Create;
   // Удаляем информацию о размере из данных.
   Delete(s, 1, Length(sl));
   Reciving:= true;
 end;
 // Сохраняем данные в файл, до тех пор, пока не получим все данные.
 try
   Data.Write(s[1], length(s));
   if Data.Size = DataSize then
   begin
     Data.Position:= 0;
     Image2.Picture.Bitmap.LoadFromStream(Data);
     Data.Free;
     Reciving:= false;
     Socket.Close;
   end;
 except
   Data.Free;
 end;
end;
Помогите советом плз ;)


Ypbi4   (2007-04-23 15:02:00) [21]

млин, наоборот :)) использует блокирущие сокеты


Ypbi4   (2007-04-23 15:01:00) [22]

Indy использует неблокирущие сокеты :(


Сергей М.   (2007-04-23 14:43:00) [23]


> есть Indy компанент, но с ним работать нельзя


Почему ?
И если нельзя, то почему не проанализировать как это сделано в Инди, благо исходники открыты ?


Ypbi4   (2007-04-23 14:33:00) [24]

это протокол SNPP, только расширеный разроботчиком. есть Indy компанент, но с ним работать нельзя :(.


Ypbi4   (2007-04-23 14:31:00) [25]

Хорошо. Допустим я обрабатываю событие OnRead:
Отослал запрос мне в ответ пришла строка содержащая "250  bla bla bla"
и Дальше что? посылать следующий запрос? Подскажи как реализовать то?
Еще есть запросы допустим query <message_id>  и в ответ приходит "ready" или тип того, Мне нужно эти данные обработать (внести в базы и т.д.) . А ждет отправки много всего. есть ли алгоритм вроде
SendCmd(), я пробовал но меня он ошибку выдает :(  ?


Сергей М.   (2007-04-23 14:12:00) [26]


> sleep(time2); // задержка что бы  дождаться данных


Зачем их "дожидаться" ?

На то есть событие OnRead.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо