Форум: "Сети";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
ВнизПоможите с UDP Найти похожие ветки
← →
-=IVA=- © (2004-06-14 14:47) [0]Пытаюсь отослать картинку (jpg) по UDP, выдает ошибку:
"Package size too big"
Что делать ?!
← →
Verg © (2004-06-14 15:26) [1]Передавать кусками
← →
-=IVA=- © (2004-06-14 15:31) [2]Изображение весит 742 байта, это много разве?
Пожно подробнее ? А то почитав форум, я толком так ничего и не понял.
← →
Verg © (2004-06-14 15:40) [3]
> [2] -=IVA=- © (14.06.04 15:31)
> Изображение весит 742 байта, это много разве?
Ага, т.е. про все остальные условия возникновения проблемы тоже надо будет догадываться?
Про способ отправки и того, кто же собственно выдает "Package size too big"?
> Пожно подробнее ? А то почитав форум, я толком так ничего
> и не понял.
Про что подробнее?
← →
-=IVA=- © (2004-06-14 15:45) [4]Вобщем так:
Использую IdUDPServer&Client
У клиента значение BufferSize стоит 8192, картинка весит 3568, отправляет только тогда, когда я пишу
IdUDPClient1.SendBuffer(ms,1467);
Иначе, если значение поставить даже 1468, то выдает ошибку...
Подробнее, про то, как кусками слать, если это ооочень большой файл будет.
← →
Verg © (2004-06-14 15:58) [5]Кто такой ms ?
← →
-=IVA=- © (2004-06-14 16:06) [6]ms - TMemoryStream
← →
Verg © (2004-06-14 16:09) [7]
> [6] -=IVA=- © (14.06.04 16:06)
> ms - TMemoryStream
Начни с того, что поправь
> IdUDPClient1.SendBuffer(ms.memory^,....);
А то ты пытаешься отправить указатель на экземпляр класса MemoryStream, а не содержимое этого стрема.
← →
-=IVA=- © (2004-06-14 16:13) [8]Здорово, спасибо...
Теперь еще :)
1. Что бы это значило ? (memory^)
2. Так как картинка весит 3568, а отсылаю я только 1467, она у меня на половину показывается. Как бы теперь это решить.
← →
Verg © (2004-06-14 16:15) [9]
> Так как картинка весит 3568, а отсылаю я только 1467, она
> у меня на половину показывается. Как бы теперь это решить.
Отсылай 3568, а не 1467.
> Что бы это значило ? (memory^)
Почитай про TMemoryStream в help-е.
← →
-=IVA=- © (2004-06-14 16:16) [10]Хотя наеврное я понял...
Надо посчитать в начале сколько она весит, потом разделить все это на 1467 и того получается в 2 с остатком приема она перешлется...
Хотя вообще странно, почему только 8192 байта можноотсылать
← →
Verg © (2004-06-14 16:28) [11]
> [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:32) [12]Это число я взял путем подбора...
Так как я писал изначально
IdUDPClient1.SendBuffer(ms.memory^,ms.Size);
Выдавалась ошибка о том, что пакет мол большой.
Я начал его понижать...и в итоге самое максимальное , что я могу отослать (что бы не возникала такая ошибка), это 1467...
Если ставлю больше - сразу ошибка (Package size too big);
← →
Verg © (2004-06-14 16:42) [13]Не-ет уж, изначально ты написал
> IdUDPClient1.SendBuffer(ms, ms.Size);
И по идее у тебя могла случаться ошибка WSAEFAULT, т.к. ты затавлял обращаться к "левому" диапазону адресов ВАП.
> IdUDPClient1.SendBuffer(ms.memory^,ms.Size);
Ты так реально пробовал?
Одним словом, прекрасно отсылаются датаграммы любого, разрешенного размера (вплоть до 65507).
← →
-=IVA=- © (2004-06-14 16:44) [14]
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 18:28) [15]
> [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 18:37) [16]
> procedure TForm1.Button2Click(Sender: TObject);
> var Buffer : array[0..10000] of byte;
> begin
> IdUDPClient1.SendBuffer(Buffer, sizeof(Buffer));
> end;
Странно все это, у меня не пашет :(
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c