Показать сообщение отдельно
Старый 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 вне форума