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

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

Вопрос про особености протокола TCP


Страницы:   1 2

tcpz ©   (2006-01-08 17:44:00) 

Скажите пожайлуста, если я отправляю скажем

test1 test2 test3

возможна ситуация когда данные придут не так как планировалось, а конкретно test2 test1 test3

Если да, как этого избежать?

Спасибо!


Каспер   (2006-03-13 20:39:00) [21]

2 Сергей
Другими словами эта процедура  -все что я имею. И знаю что она работает. :(


Каспер   (2006-03-13 20:37:00) [22]

2 Cергей
Попытаюсь как смогу ответить...
Напрямую - ответ НЕТ. Нашел в инете некий модуль и методом анализа, проб и ошибок приспособил его для своих нужд. Разобраться до конца с кодом на ПХП не получилось. :(

2 Эрейзер
Не я придумал. Для  людей кто писал сей модуль - было удобнее проще или не знаю как и почему использовать ПХП. Мне это не подходит.

2 Олл
Требуется перевести  с максимальнотвозможной точностью этот ПХП код на Дельфи под Инди 10.
Пакет приходит иногда не один :(
Сам не смог. прошу помощи...


Eraser   (2006-03-13 14:38:00) [23]


> Kacnep ©   (13.03.06 13:24) [9]


> Это ПХП.

http через UDP... оригинальное решение однако )


Сергей М.   (2006-03-13 14:01:00) [24]


> Kacnep ©   (13.03.06 13:24) [9]


Тебе был задан конкретный вопрос, известен ли тебе прикладной протокол ..

Соблаговоли ответить на него ..


Kacnep   (2006-03-13 13:24:00) [25]

Своими силами потерпел полное поражение :(

 function Communicate($command)
 {
   //If there is no open connection return false
   if(!$this->connected)
     return $this->connected;

   //write command on socket
   if($command != "")
     fputs($this->socket, $command, strlen($command));

   //get results from server
   $buffer = fread ($this->socket, 1);
   $status = socket_get_status($this->socket);
   $buffer .= fread($this->socket, $status["unread_bytes"]);

   //If there is another package waiting
   if(substr($buffer, 0, 4) == "\xfe\xff\xff\xff")
   {
     //get results from server
     $buffer2 = fread ($this->socket, 1);
     $status = socket_get_status($this->socket);
     $buffer2 .= fread($this->socket, $status["unread_bytes"]);

     //If the second one came first
     if(strlen($buffer) > strlen($buffer2))
       $buffer = substr($buffer, 14) . substr($buffer2, 9);
     else
       $buffer = substr($buffer2, 14) . substr($buffer, 9);

   }

   //In case there is only one package
   else
     $buffer = substr($buffer, 5);

   //return unformatted result
   return $buffer;

 } //function Communicate($buffer)


Это код отправки на сервер некой команды, потом получение и разбор УДП пакетов. Это ПХП.
В общем я не смог :( может кто поможет...? Разбор и получение УДП сделать?
:(((


Kacnep   (2006-03-13 10:51:00) [26]

Все как всегда разрыл в исходниках :)
Насчет NBytes вопрос снят.


Сергей М.   (2006-03-13 10:45:00) [27]


> думаю может какая то инфа теряеться при получении строк
> - скажем пара хитрых первых байт в которых зашифрована длина
> пакета и его номер?


Тебе протокол прикладного инф.обмена с сервером вообще известен ?


> Будут ли идентичны рез-ты?


Вот фрагмент исходника, делай выводы сам:


function TIdUDPBase.ReceiveString(var VPeerIP: string; var VPeerPort: integer;
const AMSec: Integer = IdTimeoutDefault): string;
var
 i: integer;
begin
 SetLength(Result, BufferSize);
 i := ReceiveBuffer(Result[1], Length(Result), VPeerIP, VPeerPort, AMSec);
 SetLength(Result, i);
end;

function TIdUDPBase.ReceiveString(const AMSec: Integer): string;
var
 VoidIP: string;
 VoidPort: Integer;
begin
 result := ReceiveString(VoidIP, VoidPort, AMSec);
end;



> Что за новый тип такой?


Выполни поиск "TBytes" по исх.текстам Indy


Каспер   (2006-03-13 10:25:00) [28]

Спасибо!
хех :((
Сервак НИКАК нельзя изменить :(
Буду пытаться рыть.
Вот что интересно ...
я с помощью инди получаю строки
а если попробовать получить буфер ?
Будут ли идентичны рез-ты? Я думаю может какая то инфа теряеться при получении строк - скажем пара хитрых первых байт в которых зашифрована длина пакета и его номер?

В соответствии с этим вопрос.
В 10ке инди
var
 tb:TBytes;
вызывает
[Error] u_CS.pas(74): Undeclared identifier: 'TBytes'
а для приема буфера требуется
сколько реально получил данных:=i_uc.ReceiveBuffer(var ABuffer :TBytes ;таймаут)

Что за новый тип такой? и можно эту строку написать правильно?
Спасибо.


Сергей М.   (2006-03-13 09:56:00) [29]


> Будет ли S содержать ВСЕ отправленные пакеты?


Не обязательно.


> в верном порядке?


Тоже не обязательно.


> тоо что можете посоветовать?


Включать в состав отправляемого инф.сообщения нечто вроде его "порядкового номера" или метки времени отправки.

На принимающей стороне при получении очередной дейтаграммы анализировать эту инф-цию и в соответствии с этим размещать полученные данные в нужную позицию потока принимаемых дейтаграмм.


Kacnep   (2006-03-13 09:17:00) [30]

Инди 10 Дельфи 6
А именно в УДП как избежать этого?
Сервер переколбашивать никак не получится... :((
Во мой код приема...

         SendComm(FPreComm+'status'); //отправляем запрос на сервер
         if Terminated then break;

{!!! Пытаемся собрать из кучи пришедших УДП пакетов один нормальный !!!}
         s:='';
         repeat
           tmps:=i_uc.ReceiveString;
           if tmps<>'' then s:=s+tmps;
         until tmps='';
         if Terminated then break;

         f_Main.AddLog('***** CS ***** : Answer: '+s,LogF);


Будет ли S содержать ВСЕ отправленные пакеты? и в верном порядке? если нет тоо что можете посоветовать?


Цукор5   (2006-01-08 18:44:00) [31]

2 tcpz
Такое возможно в UDP.


tcpz   (2006-01-08 18:10:00) [32]

Спасибо я так и думал.


Piter   (2006-01-08 17:54:00) [33]

tcpz   (08.01.06 17:44)
а конкретно test2 test1 test3


Нет, такое невозможно.


Страницы:   1 2

Наверх

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