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

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

Сообщение Source » 18.09.2007 (Вт) 23:35

ну так вопрос остаётся вопросом :)

Np5
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 11.03.2006 (Сб) 14:23
Откуда: Москва

Сообщение Np5 » 23.09.2007 (Вс) 20:00

Для получения/установки UDP буфера можно использовать getsockopt/setsockopt соотв.

dim s as long
dim SizeBuf as long 'размер буфера
dim LenVar as long 'размер SizeBuf
dim RetVal as long

LenVar=Len(SizeBuf)
s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)
'получаем текущее значение UDP буфера(значение будет сохранено в SizeBuf)
RetVal=getsockopt(s,SOL_SOCKET,SO_RCVBUF,varptr(SizeBuf),varptr(LenVar))

'Устанавливаем новое значение UDP буфера
SizeBuf=16384
RetVal=setsockopt(s,SOL_SOCKET,SO_RCVBUF,varptr(SizeBuf),LenVar)

'Если RetVal не равно SOCKET_ERROR(в обоих случаях) то все OK

ps все параметры функций(xxxsockopt) передаются как ByVal

Что касается перевода сокета в асинхронный режим, то тут есть 2-а способа:
1)WSAAsyncSelect
2)ioctlsocket

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

Сообщение Source » 23.09.2007 (Вс) 23:06

ничё себе функция, поставил 1Гб размер буфера, всё Ok, хотя у меня и памяти-то столько нет :). А так вообще клёво, ставь размер буфера сколько хочешь!
Ну, есть какие-то непонятки с передачей параметров:
1. VarPtr не нужен (то ли описание ф-и неверно, то ли что...)
2. Зачем нужно явно указывать LenVar, ведь SizeBuf передаётся как Long?
Вложения
TestMaxSizeSocketInputBuff.zip
(2.24 Кб) Скачиваний: 55

Np5
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 11.03.2006 (Сб) 14:23
Откуда: Москва

Сообщение Np5 » 24.09.2007 (Пн) 22:02

Source
1)Можно и не использовать VarPtr, а передавать переменную как ByRef, только декларировать функции надо подругому(в моём коде всё передаётся как ByVal).
2)LenVar нужна для getsockopt т.к. ф-я ожидает указатель на переменную содержащую длину SizeBuf.

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

Сообщение Source » 25.09.2007 (Вт) 0:21

я не знаю, что ты намудрил, но с твоим вариантом не работает

Np5
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 11.03.2006 (Сб) 14:23
Откуда: Москва

Сообщение Np5 » 25.09.2007 (Вт) 22:32

Source
Как это?

если декларировать getsockopt и setsockop следующим образом:

Private Declare Function getsockopt Lib "wsock32.dll" (ByVal s As Long, ByVal Level As Long, ByVal optname As Long, ByVal lpoptval As Long, ByVal lpoptlen As Long) As Long

Private Declare Function setsockopt Lib "wsock32.dll" (ByVal s As Long, ByVal Level As Long, ByVal optname As Long, ByVal lpoptval As Long, ByVal optlen As Long) As Long

то всё будет работать.

Пред.

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

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

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

    TopList