Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2013, 23:35   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию IDUDP. Package Size Too Big

Передаю мелкий пакет данных по UDP.
Сервер создаю так:
Код:
  sudp:=TIdUDPServer.Create;
  sudp.DefaultPort:=123;
  sudp.BufferSize:=udpBufSize;
  sudp.Active:=true;
Клиента так:
Код:
 udp:=TIdUDPClient.Create;  udp.Port:=123;  udp.BufferSize:=udpBufSize;
Попытка передачи данных:
Код:
 udp.Send(Host,123,s);
В строке около 20-30 символов. Есть символы переноса строки. По факту там данные из TStringList.
udpBufSize равен 100-м.

Проявляется ошибка Package Size Too Big. Не могу понять почему. Народец рекомендует не забыть про MTU. Что именно не забывать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.02.2013, 00:37   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Попробуйте точно указывать размер передаваемых данных:
sudp.BufferSize:=Length(s)*SizeOf(C har);
Человек_Борща вне форума Ответить с цитированием
Старый 13.02.2013, 07:03   #3
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

на кой вообще BufferSize трогать?
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 13.02.2013, 11:03   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
на кой вообще BufferSize трогать?
А что нужно потрогать? Я вообще не могу понять суть сей ошибки...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.02.2013, 12:01   #5
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

UDP спокойно 8к пакеты без фрагментации переваривает (при условии что настроено правильно). а по localhost все 64к

оставь по умолчанию... пусть само...
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 13.02.2013, 12:40   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тогда откуда такая ошибка?
Может я на сервере неправильно выбираю эти данные? Выборки нет - буффер и переполняется...
собсно в обработчике
Код:
procedure TServer.OnUDPReadEvent(AThread: TIdUDPListenerThread;
  AData: TIdBytes; ABinding: TIdSocketHandle);
Тупо считываю из AData как из массива. Может там нужно принудительно Recieve вызывать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.02.2013, 14:46   #7
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Цитата:
BufferSize is an Integer property used to specify the largest UDP packet that can be sent or received using Binding. The default value for BufferSize is 8192, and is assigned in Create.
Может, ты не учитываешь, что это буфер вообще, а не только "чистые" данные?

Последний раз редактировалось FataLL; 13.02.2013 в 14:54.
FataLL вне форума Ответить с цитированием
Старый 13.02.2013, 15:46   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Может...
Но тогда как поняти такую ситуацию: Бряк в этом событи срабатывает.
Далее идет
Код:
 for i:=low(AData) to High(AData) do begin
  s:=s+chr(AData[i]);
 end;
Где s - строка. То что я посылаю точ-в-точ записывается в эту переменку.
Но по прошествии где-то около 20-30 таких посылов бряк перестает работать, как будто срывается подключение.
Т.е. как я понимаю - данные доходят, но накапливаются забивая какой-то буффер, из-за чего и происходит выкидыш в исключение типа этого или Message line is too long.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.02.2013, 17:30   #9
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Попробую.. :-)
Дело в том, что у тебя действительно через 20-30 посылов из 20-30 символов коротенький буфер в 100 переполняется, ибо ты его просто просматриваешь, но не освобождаешь. Попробуй на каждый бряк сделать RecieveBuffer
FataLL вне форума Ответить с цитированием
Старый 13.02.2013, 18:50   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

RecieveBuffer будет ждать ответа в случае посыла данных. А я из сервера данные не посылаю. Я их только принимаю. Пока что все еще не расчехлился как в IDUdp работать
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка: String[1]: the Size property has an invalid size of 0. mrChester Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 1 18.01.2012 20:06
[SIZE="4"]Найти максимальное число y Delphi[/SIZE] Артем1904 Помощь студентам 5 16.12.2011 10:22
Резиновый font-size, Как сделать резионвый font-size в блоке? AlienNation HTML и CSS 0 26.09.2011 09:14
Передавать большие файлы через IdUDP SoftKoc Работа с сетью в Delphi 6 20.11.2010 14:05