IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Проблема с AThread.Connection.Socket.Recv(...) (https://www.imho.ws/showthread.php?t=105474)

Chaser 29.06.2006 09:54

Проблема с 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;

Подскажите, в чем может быть проблема и как ее решить?

gandalf_g 29.06.2006 10:56

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

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

и что мешает принять все данные (первый случай) а затем проверять есть там 'get_data' и дальше уже разбирать (имхо это логичней чем вызывать еще раз чтение из сокета)

Chaser 29.06.2006 11:26

Цитата:

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

gandalf_g 29.06.2006 16:41

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

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

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

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


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

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