imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 29.06.2006, 09:54     # 1
Chaser
Junior Member
 
Регистрация: 20.10.2005
Адрес: Москва
Сообщения: 70

Chaser Реально крут(а)Chaser Реально крут(а)Chaser Реально крут(а)Chaser Реально крут(а)
Проблема с AThread.Connection.Socket.Recv(...)

Hi All!

Проблема: Если я ставлю "AThread.Connection.Socket.Recv(...)" в "IdTCPServer1Execute(AThread: TIdPeerThread)",
то данные принимаются как надо:

Пример:

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
Rcvd: integer;
begin
Rcvd:=AThread.Connection.Socket.Recv(
PChar(@FDescriptor)[FDSize],
Sizeof(FDescriptor)-FDSize);
...
end;

Если же в IdTCPServer1Execute(AThread: TIdPeerThread) я делаю процедуру и принимаю данные уже в ней, то приложение виснет на строке "Rcvd:=AThread.Connection.Socket.Recv(...)":

Пример:

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
ch: string;
begin
ch:=Athread.Connection.ReadLn;
//
if ch='get_data'
then get_data(AThread);
...
end;

procedure get_data(AThread: TIdPeerThread);
var
Rcvd: integer;
begin
Rcvd:=AThread.Connection.Socket.Recv(
PChar(@FDescriptor)[FDSize],
Sizeof(FDescriptor)-FDSize);
...
end;

Подскажите, в чем может быть проблема и как ее решить?
Chaser вне форума  
Старый 29.06.2006, 10:56     # 2
gandalf_g
Junior Member
 
Регистрация: 09.12.2003
Адрес: Москва
Сообщения: 62

gandalf_g Путь к славе только начался
эм, непонятки небольшие, в первом случае вы просто принимаете все данные и становится ок. второй случай, вы один раз читаете строку (как я понимаю) и затем еще раз пытаетесь читать из сокета, виснет он видимо из-за того что данных которые можно было бы прочитать уже нет, и соотв AThread.Connection.Socket.Recv(...) тупо ждет "еще", а когда приходит еще, снова вызывается TForm1.IdTCPServer1Execute и понеслась...

в обоих случаях какие данные приходят?

и что мешает принять все данные (первый случай) а затем проверять есть там 'get_data' и дальше уже разбирать (имхо это логичней чем вызывать еще раз чтение из сокета)
__________________
не учите людей думать, они вам этого не простят...
gandalf_g вне форума  
Старый 29.06.2006, 11:26     # 3
Chaser
Junior Member
 
Регистрация: 20.10.2005
Адрес: Москва
Сообщения: 70

Chaser Реально крут(а)Chaser Реально крут(а)Chaser Реально крут(а)Chaser Реально крут(а)
Цитата:
Сообщение от gandalf_g
эм, непонятки небольшие, в первом случае вы просто принимаете все данные и становится ок. второй случай, вы один раз читаете строку (как я понимаю) и затем еще раз пытаетесь читать из сокета, виснет он видимо из-за того что данных которые можно было бы прочитать уже нет, и соотв AThread.Connection.Socket.Recv(...) тупо ждет "еще", а когда приходит еще, снова вызывается TForm1.IdTCPServer1Execute и понеслась...

в обоих случаях какие данные приходят?

и что мешает принять все данные (первый случай) а затем проверять есть там 'get_data' и дальше уже разбирать (имхо это логичней чем вызывать еще раз чтение из сокета)
Дело в том, что в Execute на основании сравнения пришедшей строки с имеющимися выполняется та или иная процедура, для этого то и сделно
ch:=Athread.Connection.ReadLn;

Код:
 ch:=Athread.Connection.ReadLn;
 //
 if ch='start_of_file_transfer'
 then
  begin
   copy_files(AThread);
  end;
 if ch='start_of_file_transfer'
 then
  begin
   процедура 2;
  end;
 if ch='start_of_file_transfer'
 then
  begin
   процедура 3;
  end;
 // и т.п.
Данные приходят в виде "packed record":

Rcvd:=AThread.Connection.Socket.Recv(
PChar(@FDescriptor)[FDSize],
Sizeof(FDescriptor)-FDSize);

Мне то по идее нужно, чтобы после захода в процедуру copy_files(AThread: TIdPeerThread);
C клиента данные приходили бы напрямую в AThread.Connection.Socket.Recv минуя idTCPServerExecute.

Плюс после отправки строки с клиента, данные посылаются таким образом

IdTCPClient1.OpenWriteBuffer;
IdTCPClient1.WriteStream(OutStream);
IdTCPClient1.ClearWriteBuffer;

Т.е. на сколько я знаю напрямую в Rcvd:=AThread.Connection.Socket.Recv(...)

Последний раз редактировалось Chaser; 29.06.2006 в 11:43.
Chaser вне форума  
Старый 29.06.2006, 16:41     # 4
gandalf_g
Junior Member
 
Регистрация: 09.12.2003
Адрес: Москва
Сообщения: 62

gandalf_g Путь к славе только начался
ну зачем readln и т.д. понятно более менее, в тонкостях дельфы я не силен, посему скажу как делаю я:

создается пакет данных
- команда (тип команды)
- данные нужные для выполнения команды

передается клиенту хоть серверу

из полученных данных, вытаскивается тип команды, нужные данные и передаются в соотв процедуру по типу (вместе скажем с ID отправителя), либо в отдельный поток дабы не "держать" сокет... все дело обрабатывается и результат отправляется обратно отправителю
__________________
не учите людей думать, они вам этого не простят...
gandalf_g вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 02:23.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.