![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про особености протокола TCP
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
Нет, такое невозможно.