Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

сервер на IdTCPServer [D7, XP]


vegarulez ©   (2013-03-09 00:31:00) 

Привет всем мастерам! Требутеся получить несколько байт на сервере по tcp протоколу. Накачал несколько примеров - разбираюсь - вроде бы всё понятно, но вот вопрос там везде передаётся текстовая информация, а мне надо получить 2 первых байт приходящего потока байт. И отправить тоже не текстовую информацию а тоже несколько байт. подскажите как это сделать? Пробовал разбирая пример отсылать с помощью

AContext.Connection.IOHandler.WriteLn('...')но тут получается только отправка ответа в виде текстовой строки а мен просто нужно отправить сформированный мною пару байт например: 3A 45 65 2F

Подскажите как это сделать? Куда копать? Я так понимаю в сторону передачи файлов по tcp - ведь они тоже побайтово передаются.
Подскажите тогда как правильно организовать ответ сервера - чтобы передать байты. Создать поток записать их туда и передать с помощью Write? Сделав как TByte, или TMemoryStream?
Не поделитесь ссылкой - с примерчиком, или описанием. Заранее спасибо.


Медвежонок Пятачок   (2013-04-14 21:02:00) [1]

[6] а зачем GetCurrentThreadID??

Но почему то у меня он в итерационном цикле заходит и считывает следующие 2 байта т.е. 3 и 4 получается ставит их в мемо и только потом процедура чтения с клиента завершается.

Что ты видишь в логе при приеме первых двух байтов и что ты видишь при приеме следующих двух байтов?


vegarulez   (2013-04-14 20:14:00) [2]

[6] а зачем GetCurrentThreadID??

поменял - вроде работает, но не совсем понимаю почему.

procedure TformMain.IdTCPServer1Execute(AContext: TIdContext);
var
cStr : string;
Buff : TBytes;
nContentLength : integer;
begin
try
  section.Enter;
  AContext.Connection.Socket.ReadBytes(Buff,2,false);
  cStr :=  AContext.Connection.Socket.ReadLn;
  AContext.Connection.IOHandler.WriteLn('200 Ok');
   Memo1.Lines.Add('Получено от IP: ' + AContext.Connection.Socket.Binding.PeerIP + ' ' + IntToStr(GetCurrentThreadID));
   Memo1.Lines.Add(cStr);
   Memo1.Lines.Add(BToH(Buff));
 section.Leave;
finally
begin
AContext.Connection.IOHandler.Write(Buff);
AContext.Connection.IOHandler.CloseGracefully;
end;
end;
end;


я так полагаю из за того, что  

1. полностью прочёл то что шлёт клиент в строке
  cStr :=  AContext.Connection.Socket.ReadLn;


2. ответил клиенту - тем самым как бы цикл отправки серверу завершён - т.к. получен ответ от сервера требуемый по стандарту tcp\ip в отличие от udp.

Правильны ли мои умозаключения?

Тогда ещё один вопрос в блоке finally
AContext.Connection.IOHandler.Write(Buff);
получается не будет выполнен? ибо ответ клиенту уже произошёл?
Как тогда правильно сделать...


Медвежонок Пятачок   (2013-03-29 13:30:00) [3]

Memo1.Lines.Add('Получено от IP: ' + AContext.Connection.Socket.Binding.PeerIP + ' ' + IntToStr(GetCurrentThreadID));


vegarulez   (2013-03-29 09:47:00) [4]

(BToH(Buff)) - Byte в Hex

var
 section : TCriticalSection;


vegarulez   (2013-03-29 09:28:00) [5]

Пытаюсь прочесть первые 2 байта данных. И после этого разорвать соединение. Корректно, отправив обратной стороне в ответ буфер этих 2-ух байт. Но почему то у меня он в итерационном цикле заходит и считывает следующие 2 байта т.е. 3 и 4 получается ставит их в мемо и только потом процедура чтения с клиента завершается.
Что я делаю не так?
procedure TformMain.IdTCPServer1Execute(AContext: TIdContext);
var
cStr : string;
Buff : TBytes;
nContentLength : integer;
begin
try
  section.Enter;
   AContext.Connection.Socket.ReadBytes(Buff,2,false);
   Memo1.Lines.Add('Получено от IP: ' + AContext.Connection.Socket.Binding.PeerIP);
   Memo1.Lines.Add(cStr);
   Memo1.Lines.Add(BToH(Buff));
  section.Leave;
finally
 begin
  AContext.Connection.IOHandler.Write(Buff);
  AContext.Connection.IOHandler.CloseGracefully;
 end;
end;
end;


Dimka Maslov   (2013-03-09 10:24:00) [6]

По протоколу tcp передаются двоичные данные. Для передачи файлов используются протоколы более высокого уровния http, ftp, smtp. Поэтому все средства работы с tcp используют двоичный буфер. В данном случае нам надо принять два байта (указать размер буфера приёма в два байта, когда они придут процедура recv завершит работу), а потом так же послать сколько надо через send и прекратить соединение.


Anatoly Podgoretsky   (2013-03-09 08:00:00) [7]

> Германн  (09.03.2013 01:56:01)  [1]

Кроме того в примере только текстовая информация


Германн   (2013-03-09 01:56:00) [8]


> Я так понимаю в сторону передачи файлов по tcp

Неправильно понимаешь. Общение по TCP подразумевает обмен именно двоичной информацией без точного определения её типа.


Наверх

Титульная страница Поиск, карта сайта Написать письмо