![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про особености протокола TCP
tcpz © (2006-01-08 17:44:00)Скажите пожайлуста, если я отправляю скажем
test1 test2 test3
возможна ситуация когда данные придут не так как планировалось, а конкретно test2 test1 test3
Если да, как этого избежать?
Спасибо!
Kacnep (2006-03-22 08:52:00) [1]Всем Спасибо!
Отдельное спасибо Сергею за попытку по настоящему понять проблему тупня. :(((
Проблема решена и совсем не втом месте. Дельфи и Инди рулят! Просто мозг нужно заряжать не орехами и главное вовремя :))).
В общем приходило нормально оба пакета! Прога ИХ НОРМАЛЬНО СУММИРОВАЛА. Но! Смотрим как
string:=1пакет;
если есть второй пакет то string:=string+второй пакет
И ВНИМАТЕЛЬНО ВИДЯ :))) что первый пакет оканчивается на #0#0!!!! (и это все в тип string :( ну е ма е %( ) что же получиться если к строке завершенной 0 добвить строку... :(
В общем ИНДИ Железно работаю!
Еще раз спасибо всем... Иногда трассировка помогает :)
Сергей М. (2006-03-21 09:12:00) [2]
> Kacnep © (21.03.06 05:10) [30]
Поясни, что ты подразумеваешь под "пакетами" ..
На уровне UDP есть сообщения (ну или дейтаграммы), а пакеты - это на уровне IP .. Разбитие сообщения на пакеты и сборка его из пакетов - не твоя забота .. Твоя забота - прочитать принятое сообщение либо целиком либо последовательно, фрагмент за фрагментом ..
Polevi (2006-03-21 09:07:00) [3]>Kacnep © (21.03.06 05:10) [30]
делфи вообще ацтой
VirEx знает как, спроси у него
Kacnep (2006-03-21 05:10:00) [4]Главное во всех примерах на тех же СИях возможно собрать пакеты воедино а в дельфях получаеться нет? - не поверю!
VirEx (2006-03-20 22:31:00) [5]а кто воздержится?
Piter (2006-03-20 22:28:00) [6]не знаю
VirEx (2006-03-20 22:23:00) [7]да
Polevi (2006-03-20 13:39:00) [8]нет
Kacnep (2006-03-20 13:07:00) [9]2 ОЛЛ
Люди... облазил кучу сайтов с примерами -НО ОНИ ВСЕ либо на СИ либо на РНР :( А там типа все просто - можно получить размер посылки. А потом уже исходя из нее получать и дефрагментировать пакеты.
Тогда вопрос немного сдвину в другую плоскость
Если сервер передал мне ХYZ байт - что я пока не знаю.
Пришла какая то часть (первый пакет) - МОГУ ли я как нить узнать размер всей посылки из первого пакета? Если в теле не шифруется (не отправляется специально) размер всей посылки.
Что то типа TidUDPClient.РазмерВсейПосылки_ЧьейЧастьюЯвляетсяЭтотКусок?
VirEx (2006-03-19 20:35:00) [10]дайте как вспомню, стек протокола айй пи:
программный
транспортный
туннельный
аппаратный
UDP находится в транспортном, вроде... ик, ик :)
Сергей М. (2006-03-15 09:56:00) [11]
> саму проблему фрагментирования УДП пакетов знаю и представляю
Фрагментирование относится не к UDP, а к низлежащему IP,
http://www.zeiss.net.ru/docs/technol/tcpip/tcp11.htm#t115000
OldNaum (2006-03-14 19:48:00) [12]каспер. иди на sourceforge.net и фильтруй по Counter-Strike. да прибудет с тобой сила, а со мной мои телепатические способности )
Каспер (2006-03-14 19:19:00) [13]2 Сергей
Клиент написаный на ПХП полностью рабочий!
Он реально работает!
Я думал смогу расковыряв то что мне нужно в его коде написать маааленькую приблуду :( не получилось - не смог разобраться.
Поэтому вылез на форум, расширил проблему (фрагментация Н пакетов - и их сбор) поискал - нашел наиболее подходящий топик. И продолжил его. Я не сказал бы что ничего не понимаю в сетевом программировании. И Уважаемого Подгорецкого перевод прочел. До этого писали свою аську -как раз на ней учились. Т.е. саму проблему фрагментирования УДП пакетов знаю и представляю - но с инди не получается = чего то недопонимаю. Вот и прошу помощи. Требуеться разобрать пришедшие один или два пакета - пример разбора приведен но на ПХП а нужно в Инди :(
Мастера! Помогите! Плиз.
Сергей М. (2006-03-14 14:06:00) [14]С чего ты вообще взял, что некая инф-ция отправлена сим сервером в виде несколькихпакетов ?
Kacnep (2006-03-14 14:02:00) [15]2 Сергей
В таком случае если не рыть глубже это мертвое начинание... :(
Тогда возьмем тупо предположим что весь разбор пришедших пакетов лежит тут
//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;
и что мы знаем что пришли 1..2 пакета у которых в заголовке 4 байта если первый пакет то #255#255#255#255 если второй то #254#255#255#255.
Это то что я понял...
А дальше они как то волшебным образом их компонуют в один если их два :(
Как на дельфи проверить после прихода одного пакета -есть ли еще что нить? В общем самое классное если кто то знаком с ПХП хотяб на минимальном уровне :( Тогда легко переведется
Сергей М. (2006-03-14 13:33:00) [16]
> Kacnep © (14.03.06 13:27) [17]
Многое (если не все) зависит от реализации ПХПшного fread() в случае когда он работает с UDP-гнездом .. Ибо как таковое чтение из UDP-гнезда сводится в вызову ф-ции Winsock.recvfrom(), особенности логики работы которой ты в состоянии прочитать/осмыслить самостоятельно.
Kacnep (2006-03-14 13:27:00) [17]2 Плохиш
я вытавил код протокола в другом языке писаный.
Требуется решить проблему с фрагментированными УДП пакетами в Дельфи с использованием инди 10, по аналогии с поцедурой которая описана выше этого длинного поста на ПХП.
Плохиш (2006-03-14 11:29:00) [18]А что здесь правила уже изменились? или мы на форуме по пхп находимся?
Kacnep (2006-03-14 06:28:00) [19]2 Эрейзер
Уверен!
Вот от чего я отталкивался! Не хотел захламлять но видимо придеться -потом надеюсь модер не обидиться и потрет.
Вот от чего я начал писать этот проект.
НО ПОВТОРЮСЬ! Нужно правильно перевести на Дельфи в Инди кусочек кода приведеный выше. Там как раз идет разбор УДПшных пакетов. Это единственная инфа по протоколу используемому утилитой rcon которой я владею. УВЕРЕН ее достаточно!
Eraser (2006-03-13 22:11:00) [20]
> Каспер (13.03.06 20:37) [12]
уверен что эта процедура отправляет данные по UDP?