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

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

Поможите с UDP [D7, Win2k]


-=IVA=- ©   (2004-06-14 14:47:00) 

Пытаюсь отослать картинку (jpg) по UDP, выдает ошибку:
"Package size too big"
Что делать ?!


-=IVA=-   (2004-06-14 18:37:00) [1]


> procedure TForm1.Button2Click(Sender: TObject);
> var Buffer : array[0..10000] of byte;
> begin
>  IdUDPClient1.SendBuffer(Buffer, sizeof(Buffer));
> end;


Странно все это, у меня не пашет :(


Verg   (2004-06-14 18:28:00) [2]


> [14] -=IVA=- ©   (14.06.04 16:44)


ms.size > предельный размер датаграммы, который можно получить
var
   MaxDS, SzSz : integer;
.................
 SzSz := sizeof(MaxSZ);
 getsockopt(IDUDPClient1.Binding.Handle, SOL_SOCKET,
                 SO_MAXDG, pchar(@MaxDS), SzSz);

Все, других причин быть не может.
Проверяй ms.Size.


> Вот...зачем мне врать...полный текст отправки


Ну и мне незачем - у меня подобный код работает без проблем.

procedure TForm1.Button2Click(Sender: TObject);
var Buffer : array[0..10000] of byte;
begin
 IdUDPClient1.SendBuffer(Buffer, sizeof(Buffer));
end;


-=IVA=-   (2004-06-14 16:44:00) [3]

ms:=TMemoryStream.Create;
ms.Position:=0;
Image1.Picture.Graphic.SaveToStream(ms);
ms.Position:=0;
IdUDPClient1.SendBuffer(ms.memory^,ms.Size);
ms.Free;


Вот...зачем мне врать...полный текст отправки
Может в другом месте ошибка?


Verg   (2004-06-14 16:42:00) [4]

Не-ет уж, изначально ты написал


> IdUDPClient1.SendBuffer(ms, ms.Size);


И по идее у тебя могла случаться ошибка WSAEFAULT, т.к. ты затавлял обращаться к "левому" диапазону адресов ВАП.


> IdUDPClient1.SendBuffer(ms.memory^,ms.Size);


Ты так реально пробовал?

Одним словом, прекрасно отсылаются датаграммы любого, разрешенного размера (вплоть до 65507).


-=IVA=-   (2004-06-14 16:32:00) [5]

Это число я взял путем подбора...
Так как я писал изначально
IdUDPClient1.SendBuffer(ms.memory^,ms.Size);
Выдавалась ошибка о том, что пакет мол большой.
Я начал его понижать...и в итоге самое максимальное , что я могу отослать (что бы не возникала такая ошибка), это 1467...
Если ставлю больше - сразу ошибка (Package size too big);


Verg   (2004-06-14 16:28:00) [6]


> [10] -=IVA=- ©   (14.06.04 16:16)
> Хотя наеврное я понял...
> Надо посчитать в начале сколько она весит, потом разделить
> все это на 1467 и того получается в 2 с остатком приема
> она перешлется...
> Хотя вообще странно, почему только 8192 байта можноотсылать


Чего? Зачем делить на 1467? Ты это откуда взял это число?

UDP - протокол для передачи датаграмм без гарантии доставки и без гарантии последовательности.

Максимальный размер информационной части передаваемой UDP датаграммы можно узнать из опции SOL_SOCKET по имени SO_MAXDG (getsockopt). И для Win2K она равна что-то около 65000.


-=IVA=-   (2004-06-14 16:16:00) [7]

Хотя наеврное я понял...
Надо посчитать в начале сколько она весит, потом разделить все это на 1467 и того получается в 2 с остатком приема она перешлется...
Хотя вообще странно, почему только 8192 байта можноотсылать


Verg   (2004-06-14 16:15:00) [8]


> Так как картинка весит 3568, а отсылаю я только 1467, она
> у меня на половину показывается. Как бы теперь это решить.


Отсылай 3568, а не 1467.


>  Что бы это значило ? (memory^)


Почитай про TMemoryStream в help-е.


-=IVA=-   (2004-06-14 16:13:00) [9]

Здорово, спасибо...
Теперь еще :)
1. Что бы это значило ? (memory^)
2. Так как картинка весит 3568, а отсылаю я только 1467, она у меня на половину показывается. Как бы теперь это решить.


Verg   (2004-06-14 16:09:00) [10]


> [6] -=IVA=- ©   (14.06.04 16:06)
> ms - TMemoryStream


Начни с того, что поправь


> IdUDPClient1.SendBuffer(ms .memory^,....);


А то ты пытаешься отправить указатель на экземпляр класса MemoryStream, а не содержимое этого стрема.


-=IVA=-   (2004-06-14 16:06:00) [11]

ms - TMemoryStream


Verg   (2004-06-14 15:58:00) [12]

Кто такой ms ?


-=IVA=-   (2004-06-14 15:45:00) [13]

Вобщем так:
Использую IdUDPServer&Client
У клиента значение BufferSize стоит 8192, картинка весит 3568, отправляет только тогда, когда я пишу
IdUDPClient1.SendBuffer(ms, 1467);
Иначе, если значение поставить даже 1468, то выдает ошибку...

Подробнее, про то, как кусками слать, если это ооочень большой файл будет.


Verg   (2004-06-14 15:40:00) [14]


> [2] -=IVA=- ©   (14.06.04 15:31)
> Изображение весит 742 байта, это много разве?


Ага, т.е. про все остальные условия возникновения проблемы тоже надо будет догадываться?

Про способ отправки и того, кто же собственно выдает "Package size too big"?


> Пожно подробнее ? А то почитав форум, я толком так ничего
> и не понял.


Про что подробнее?


-=IVA=-   (2004-06-14 15:31:00) [15]

Изображение весит 742 байта, это много разве?

Пожно подробнее ? А то почитав форум, я толком так ничего и не понял.


Verg   (2004-06-14 15:26:00) [16]

Передавать кусками


Наверх

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