Цитата:
|
Сообщение от 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(...)