Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с сетью: Udp
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
trminator
Привет! Скажите пожалуйста, есть ли в Дельфийском компоненте TNMUDP какие-либо ограничения на размер посылаемого буфера? По идее, сам протокол UDP никаких ограничений не имеет. Но если я пытаюсь послать буфер размером чуть больше 4-х килобайт, его просто не получают sad.gif( Даже если я его себе самому посылаю, не получаю.

С пакетами примерно в килобайт все нормально.

Не предлагайте только дробить длинные сообщения -- протокол, который я пытаюсь реализовать, придумывал не я +)
trminator
Неужели никто не знает? Блин, пока проблему обошел, но скоро, чувствую, опять она меня иметь будет...
CJ
Хм.. вот не знаю..а ты попробуй так, послать очень большой , а потом постепенно уменьшать пока не отправиться!
trminator
Ну на самом деле есть определенный протокол, который я хочу сымитировать. Точнее:

-- Есть программа, которая мне не нравится
-- Есть программист, которому так надоели стоны, что, дескать, "программа у тебя кривая", что он выложил протокол и сказал: "Кому не нравится -- VisualStudio вам в руки =)" (ну я Дельфи взял=)
-- Есть не в меру заносчивый trminator, который взялся писать прогу "под себя" (впрочем, кое-что она уже делает лучше =) можно еще ускорять)

Некоторые сообщения могут достигать такого размера. Хорошо, что не все =) На их существование я пока забил, но все-таки.. нехорошо это

ЗЫ Килобайт точно передается. Точнее не определял.
CJ
Дай заценить что она щас умеет?
trminator
Не дам =) нашел багу =) гнусную
P@sh@
я как раз занимаюсь сейчас клиент-серверным пакетом тоже на компонентах NMUDP, точнее он уже два месяца как активно используется, щас только глюки исправляю smile.gif... опытным путем установил, что максимальный размер буфера для передачи через NMUDP не должен превышать 2 кб, иначе приходит NumberBytes=-1. Это видимо ограничение компонента, рекомендуют использовать Indy, но мне и этого хватает.
P@sh@
еще слышал, что дефолтные размеры UDP-пакетов меняются от системы к системе, и желательно ограничиться 4-мя килобайтами, меньше вряд ли будут.

а в NMUDP еще потоковый обмен глючно работает с большими блоками данных (~сотни килобайт), так что лучше не использовать SendStream...
trminator
Ну сто кило никто и не пытается послать =)
#define MAX_MSG_SIZE 4096
...
typedef struct
{
unsigned char code;
unsigned char From[16];
unsigned char Subj[64];
int   Time;
unsigned char To[16];
unsigned int IP;
unsigned char Flag;
unsigned char Text[MAX_MSG_SIZE];
} MSG_TAKE_NEWS_STR;
Вот такую бяку посылать надо (и принимать). На самом деле, от последнего массива можно посылать только "хвост" -- то, что там является текстом

А еще меня бесит, что строки -- не строки, а массивы символов. Геморроя с этим... Короче все выкинул, начал писАть заново B)
P@sh@
причем не любые массивы символов, а только СТАТИЧЕСКИЕ!!

на компоненте NMUDP очень легко сделать чат, но для серъезных приложений наверное лучше что-нибудь другое...

ну кто не пытается 100 кб послать, а кто и мегабайты перекачивает... пришлось вот чуть ли не фтп-протокол писать упрощенный smile.gif думаешь, сколько времени будет мегабайт передаваться пакетами по 2кб?
trminator
Это как раз чат =) с возможностью посылки "новостей" (по сути -- instant messaging'ом, только эту "новость" можно послать всем сразу). Им польхзуются около 700 человек (в нашей сетке). И проблема как раз с получением новостей (из-за нее я и начал писАть все по новой =) )

На бумажке все просто: посылвешь запрос на новость, получаешь ответ -- заголовки сообщений. Смотришь, есть ли у тебя такие заголовки (не устарела ли новость), если нет -- просишь передать ее целиком. На практике заголовки получаю всегда, а новости -- примерно 20%

---
И, кстати, не факт, что по 2 кило не быстрее, чем сразу метр =) Для TCP, например, небольшие пакеты выгоднее посылать
P@sh@
я разве говорил, что медленнее? я просто для прикола спросил smile.gif
на самом деле передается довольно быстро, если учесть, что объем удваивается за счет подтверждающих пакетов с контрольной суммой (их размеры конечно гораздо меньше, но какая разница, если передаются они одинаково), только потери бывают часто (сеть у нас довольно перегруженная)
trminator
Ладно, попробую Инди присобачить...
Спасибо
hiv
На самом деле размер пакета ограничиваестя железом а не программно, на сколько помню не более 1400 байт. Но пакеты можно делить на фреймы, а на приемной стороне их собирать учитывая их последовательность, т.к. маршрут прохождения фреймов может быть разный в сложных сетях. Это дробление чисто программная вешь, по идее должна реализовываться на уровне протокола (TCP UDP и т.д.)
trminator
Так по идее-то это должно быть прозрачно для пользователя (ну и программиста тоже). Ан нет, не совсем...

Вот будет время - доложу про испытания Indy. только там переписывать прилично -- в Инди это разделено на клиент и сервер. Зачем, интересно...
P@sh@
trminator
я недавно решил все же глянуть в хелп по сокетам, и почти сразу возник вопрос - нахрена я мучался-разбирался со всякими Indy и NM-компонентами? то, что мне было нужно, легко реализовывалось с помощью стандартных виндовых сокетов!
посмотри стандартные демки двух чатов - не намного сложнее, чем на NMUDP

PS: что значит "зачем разделено на клиент и сервер" ? даже в UDP необходимо как-то принимать пакеты, а не только отправлять, а для приема надо ждать и проверять состояние порта (listen - "слушать"), чем и занимается серверная часть программы (в NMUDP это делается незаметно для пользователя, только вызывается событие OnDataReceived, когда пакет пришел)
trminator
Погоди... сокеты разве не только TCP? (глупый вопрос, наверное...) Спасибо, посмотрю
Цитата
зачем разделено на клиент и сервер

Да не обращай внимания, стормозил просто :P Привыкнуть уже успел к TNMUDP

После сессии вплотную заняться надо
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.