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