Приёмный буфер сокета UDP

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Приёмный буфер сокета UDP

Сообщение Source » 15.09.2007 (Сб) 17:26

1.Вот тест, который показывает, что приёмный буфер сокета UDP может принять всего 8Кб данных. Отчего сей буфер столь мал?

2. Как можно определить число отброшенных пакетов из-за заполненного буфера приёма?
Вложения
TestMaxSizeSocketInputBuff.zip
(1.96 Кб) Скачиваний: 77

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.09.2007 (Вс) 10:09

UDP-пакеты не дробятся, и поэтому ограничены в размере самым узким местом сети от источника к приёмнику.
Т.е. даже гарантии, что 8Кб пройдут, у тебя нет.

Если нужна гарантия, юзай TCP.
Изображение

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 16.09.2007 (Вс) 12:07

а какое м.б. самое узкое место в сети (байт)? Правильно ли я сделал обработку ошибки в примере?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.09.2007 (Вс) 15:19

0 байт. Могут вообще пакеты не доходить.
Изображение

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 16.09.2007 (Вс) 16:45

я имею ввиду, какой максимальный размер пакетов может проходить в самом узком месте сети? И с чем тога может быть связано такое понятие, как фрагментация пакета UDP, если пакеты не дробятся?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 16.09.2007 (Вс) 17:00

Зависит от твоей сети. Не от типа сети, не от построения. От конкретно ТВОЕЙ сети, и ее текущей загруженности.
label:
cli
jmp label

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.09.2007 (Вс) 17:04

1. Чесслово, тебе это не нужно. Потому что я не представляю ни одной задачи, где это могло быть нужно.
В MS не дураки сидят, они до тебя весь стек TCP/IP так написали, что буфера сами заполняются как нужно.

2. Угу, похоже что могут дробиться. Но всё равно роутеры по дороге имеют право не дробить, а выкидывать непролезшие пакеты, так что какая разница?

(Также выгуглилось http://lists.apple.com/archives/darwin- ... 00069.html , можешь поглядеть)
Изображение

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 16.09.2007 (Вс) 17:55

1. Почему не надо? Если мне будет идти огромное кол-во данных, разве пакеты не будут убиваться, когда 8Кб буфера будет заполнено?

2. не знаю, чё там написано на аглицком языке, но я сам видел, как в моём примере сокет не принимает более 8Кб в буфер.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.09.2007 (Вс) 18:09

Source писал(а):1. Почему не надо? Если мне будет идти огромное кол-во данных, разве пакеты не будут убиваться, когда 8Кб буфера будет заполнено?

Если к тебе будет идти огромное кол-во данных по UDP, то ты всё равно никак не можешь повлиять на то, какая их часть до тебя дойдёт, так что нет смысла и пытаться.

Если к тебе будет идти огромное кол-во данных по TCP, то тебе придёт всё.
Изображение

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 16.09.2007 (Вс) 18:42

да я не имею ввиду потерю данных где-то в сети, я имею ввиду потерю при попытке записи в заполненный буфер моего сокета!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.09.2007 (Вс) 19:08

А в чём разница?
Изображение

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 16.09.2007 (Вс) 19:23

разница в том, что я могу обрабатывать данные прямо в Data_Arrival сокета или же сначала быстро вытягивать их в память, а потом обрабатывать. Но, т.к. механизм сего действия надо хорошо продумать, а потом реализовать, к тому же это обойдётся программе доп. затратами на работу, лучше было бы, если бы приёмный буфер сокета был намного больше. В конце концов, свободны мегабайты памяти, а буфер сокета всего 8Кб! :evil:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.09.2007 (Вс) 19:28

Блин. Давай в четвёртый раз напишу?
Если тебе пофиг, что пакеты могу теряться, тогда тебе не важно, какого размера буфер. Обрабатывай в _DataArrival
Если тебе не пофиг, что пакеты могу теряться, тогда тебе не подходит UDP.
Изображение

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 16.09.2007 (Вс) 19:45

мне пофиг, что пакеты могут теряться в сети, но не пофиг, что они будут теряться у меня прямо на компе из-за малого размера буфера, т.к. здесь будет теряться их намного больше,чем в сети.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.09.2007 (Вс) 20:07

Если ты допускаешь потерю хотя бы одного пакета, какая разница, сколько всего их пропадёт?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 16.09.2007 (Вс) 20:17

чем больше пропадает, тем больше надо слать вновь, тем больше загрузка сети. Что тут неясного?

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 16.09.2007 (Вс) 21:07

Если это важно, то не надо использовать UDP.
Изображение

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 16.09.2007 (Вс) 21:30

я понял, что никто не знает, как увеличить приёмный буфер контрола Winsock и не может ответить на вопросы первого поста. Единственное полезное, что я узнал от Тёмыча, что в узком месте сети физически может не пройти пакет 8Кб, это ж какой старой должна быть сеть? Ну и на том спасибо.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.09.2007 (Вс) 21:41

Source
Перечитай ответ iGrok-а.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 16.09.2007 (Вс) 22:10

Source
Ты видимо не желаешь слышать то, что тебе говорят. Приёмный буфер - константа, а UDP для больших объёмов данных не приспособлен - только короткие сообщения, которые могут вообще не дойти. Поскольку гарантии прихода данных нет, то не имеет смысла его изменять - хоть гигабайт поставь, всё равно будет вероятность переполнения.
Изображение

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 17.09.2007 (Пн) 1:02

Странный подход, у Вас, товарисчи программеры, почему-то в других контролах такого типа возможность задать размер буфера присутвует и не огранничивается размеров 8 кб как у мс, боллее того на апишном уровне также можно реализовать эту нехитрую фишку, немогу сказать что она действительно часто необходима, но такие ситуации бываю, прогресс ведь на месте не стоит, а разработчики винсок контрола поступили мне кажется в этой ситуации не очень хоросцо!, но не я им судья однако! а вот собственно почему 8 кб ? это что типа - золотая середина такая что - ли или есть более конкретная мотивация ?

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 17.09.2007 (Пн) 7:34

я уж тоже подумываю об апишках, но только я ещё не знаю, как там делается обработчик вроде Data_Arrival, наверное, через сообщения окну. И какой размер буфера там можно устанавливать? Вроде там тоже есть ограничения. Придётся рыться в инете.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 17.09.2007 (Пн) 19:51

а чего, метод Send работает в фоновом режиме, что на цикле отправки ошибка вылазит?

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 17.09.2007 (Пн) 21:33

Да, там используется WSASend с заданной lpComplectionRoutine. + у контрола есть свойство, которое выдаёт системный описатель сокета - мучайте его апишками, сколько душе угодно.

P. S. Программирование сокетов на чистом API - нетривиальная задача, особенно на VB.
Изображение

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 17.09.2007 (Пн) 22:36

а почему ошибка выходит только 1 раз, должна выпадать на каждый 9-й шаг, когда отправляющий буфер сокета заполнен 8Кб и данные ещё не успели передаться?

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 18.09.2007 (Вт) 20:04

ладно, раз никто не хочет отвечать, будем считать что сокету стало не интересно, и он гордо перешёл в некий блокирующий режим :D

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 18.09.2007 (Вт) 20:34

Заметьте - иногда людям проще придумать какую нибудь свою огромную теорию, чем попробовать понять, что же до них хотят донести другие.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 18.09.2007 (Вт) 20:48

хорошо, я замечу. Как вернуть сокет в неблокирующий режим?

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 18.09.2007 (Вт) 21:08

Сначала определись с понятием неблокирующий/блокирующий режим. Обычно это связывают а асинхронностью/синхронностью обращений к сокету.
Изображение

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 18.09.2007 (Вт) 21:34

а я думал, это связывают с асинхронностью/синхронностью работы сокета.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 99

    TopList