Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

Поможите с 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.047 c
4-1088691398
BillyJeans
2004-07-01 18:16
2004.08.15
Форма и её контролы...


6-1087208264
alexa
2004-06-14 14:17
2004.08.15
Mailslots


8-1085346895
AGGRESSOR
2004-05-24 01:14
2004.08.15
SndVol32 в WinXP


3-1089954838
Hereticsoul
2004-07-16 09:13
2004.08.15
список таблиц в mysql


4-1089143291
Ермак
2004-07-06 23:48
2004.08.15
Содержимое директории