| imho.ws |
![]() |
|
|
|
# 1 |
|
Junior Member
Регистрация: 20.10.2005
Адрес: Москва
Сообщения: 70
![]() ![]() ![]() ![]() |
Проблема с 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; Подскажите, в чем может быть проблема и как ее решить? |
|
|
|
|
# 2 |
|
Junior Member
Регистрация: 09.12.2003
Адрес: Москва
Сообщения: 62
![]() |
эм, непонятки небольшие, в первом случае вы просто принимаете все данные и становится ок. второй случай, вы один раз читаете строку (как я понимаю) и затем еще раз пытаетесь читать из сокета, виснет он видимо из-за того что данных которые можно было бы прочитать уже нет, и соотв AThread.Connection.Socket.Recv(...) тупо ждет "еще", а когда приходит еще, снова вызывается TForm1.IdTCPServer1Execute и понеслась...
в обоих случаях какие данные приходят? и что мешает принять все данные (первый случай) а затем проверять есть там 'get_data' и дальше уже разбирать (имхо это логичней чем вызывать еще раз чтение из сокета)
__________________
не учите людей думать, они вам этого не простят... |
|
|
|
|
# 3 | |
|
Junior Member
Регистрация: 20.10.2005
Адрес: Москва
Сообщения: 70
![]() ![]() ![]() ![]() |
Цитата:
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; // и т.п. 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. |
|
|
|
|
|
# 4 |
|
Junior Member
Регистрация: 09.12.2003
Адрес: Москва
Сообщения: 62
![]() |
ну зачем readln и т.д. понятно более менее, в тонкостях дельфы я не силен, посему скажу как делаю я:
создается пакет данных - команда (тип команды) - данные нужные для выполнения команды передается клиенту хоть серверу из полученных данных, вытаскивается тип команды, нужные данные и передаются в соотв процедуру по типу (вместе скажем с ID отправителя), либо в отдельный поток дабы не "держать" сокет... все дело обрабатывается и результат отправляется обратно отправителю
__________________
не учите людей думать, они вам этого не простят... |
|
|