Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.02.16;
Скачать: CL | DM;

Вниз

сервер на IdTCPServer   Найти похожие ветки 

 
vegarulez   (2013-03-09 00:31) [0]

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

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

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


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


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

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


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

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

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


 
Dimka Maslov ©   (2013-03-09 10:24) [3]

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


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

Пытаюсь прочесть первые 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;


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

(BToH(Buff)) - Byte в Hex

var
 section : TCriticalSection;


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

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


 
vegarulez   (2013-04-14 20:14) [7]

[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-04-14 21:02) [8]

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2014.02.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.007 c
15-1378133550
Степан Потапов
2013-09-02 18:52
2014.02.16
Кто переименовывает, а кто нет? (опрос)


2-1365768017
__
2013-04-12 16:00
2014.02.16
Что может быть с системой если после int 3 спасает только Reset


2-1366182901
ttt
2013-04-17 11:15
2014.02.16
Перемещение окна


2-1366625537
novai
2013-04-22 14:12
2014.02.16
проблемма с BorderStyle:= bsNone;


15-1377798356
Никонов Сергей
2013-08-29 21:45
2014.02.16
Глюки аппаратные проблемы или ошибки программистов?