Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 30.08.2007
Сообщений: 35

Как открыть НЕблокирующий сокет?

30.03.2008, 23:57. Показов 2820. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем.
Тут вот задумал проксю написать - а вот как на VB неблокирующий сокет открыть не знаю. В С++ лезть не очень хочется - может кто знает ???
ЗЫ это сокет на который клиент может открыть несколько соединений.
С уважением жду ответа...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.03.2008, 23:57
Ответы с готовыми решениями:

Как узнать, что неблокирующий сокет отключился
Здравствуйте, нужен неблокирующий клиентский сокет, который работает до тех пор, пока соединение сокета живо. Пытаюсь реализовать, но...

Неблокирующий сокет
Приветствую. Появился вопрос: имеется сокет (tcp), который подключается к серверу и получает информацию в разное время. Там используется...

Неблокирующий сокет
Добрый день. Фишка в создание связи клиенты-сервер, где сервер работает в однопоточном режиме. Реализацию сказали сделать с помощью...

8
0 / 0 / 0
Регистрация: 20.02.2008
Сообщений: 181
31.03.2008, 14:36
Вот примерчик если знаком с Winsock API.
Функция открытия сокета и установки/снятия блокировки.
Не обращай внимание на хаос - это только для примера. Реально эти функции и объявления находятся в разных модулях и классах. Разберёшся.

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
Option Explicit
 
Public Enum AddressFamily
    AF_UNSPEC = 0
    AF_UNIX = 1
    AF_INET = 2
    AF_IMPLINK = 3
    AF_PUP = 4
    AF_CHAOS = 5
    AF_NS = 6
    AF_IPX = AF_NS
    AF_ISO = 7
    AF_OSI = AF_ISO
    AF_ECMA = 8
    AF_DATAKIT = 9
    AF_CCITT = 10
    AF_SNA = 11
    AF_DECnet = 12
    AF_DLI = 13
    AF_LAT = 14
    AF_HYLINK = 15
    AF_APPLETALK = 16
    AF_NETBIOS = 17
    AF_VOICEVIEW = 18
    AF_FIREFOX = 19
    AF_UNKNOWN1 = 20
    AF_BAN = 21
    AF_ATM = 22
    AF_INET6 = 23
    AF_CLUSTER = 24
    AF_12844 = 25
    AF_MAX = 26
End Enum
 
Public Enum SocketType
    ST_STREAM = 1
    ST_DGRAM = 2
    ST_RAW = 3
    ST_RDM = 4
    ST_SEQPACKET = 5
End Enum
 
Public Enum SocketProtocol
    SP_IP = 0
    SP_ICMP = 1
    SP_IGMP = 2
    SP_GGP = 3
    SP_TCP = 6
    SP_PUP = 12
    SP_UDP = 17
    SP_IDP = 22
    SP_ND = 77
    SP_RAW = 255
    SP_MAX = 256
End Enum
 
Public Const DEF_SOCKET_ADDRESSFAMILY As Long = AF_INET
Public Const DEF_SOCKET_TYPE As Long = ST_STREAM
Public Const DEF_SOCKET_PROTOCOL As Long = SP_TCP
 
Public Const FIONREAD = &H8004667F
Public Const FIONBIO = &H8004667E
Public Const FIOASYNC = &H8004667D
 
Public Declare Function WS_Socket Lib 'wsock32.dll' Alias 'socket' (ByVal AddressFamily As Long, ByVal SocketType As Long, ByVal SocketProtocol As Long) As Long
Public Declare Function WS_IOControl Lib 'wsock32.dll' Alias 'ioctlsocket' (ByVal Socket As Long, ByVal Command As Long, argp As Long) As Long
 
Private m_Socket As Long 'in Socket class
Private m_IsBlocked As Boolean 'in Socket class
 
Public Const SOCKET_NOERRORS = 0
Public Const SOCKET_NONBLOCKING As Long = 1
Public Const SOCKET_BLOCKING As Long = 0
 
Sub dd()
    Dim Socket As Long
    Socket = WS_Socket(DEF_SOCKET_ADDRESSFAMILY, DEF_SOCKET_TYPE, DEF_SOCKET_PROTOCOL)
    m_Socket = Socket
    'net proverki !
End Sub
 
Public Property Let IsBlocked(IsBlocked As Boolean)
    Dim Response As Long
    Dim Error As Long
    If IsBlocked = True Then
        Response = WS_IOControl(m_Socket, FIONBIO, SOCKET_BLOCKING)
        If Response <> 0 Then Error = Err.LastDllError: GoTo ERR_HANDLER
    Else
        Response = WS_IOControl(m_Socket, FIONBIO, SOCKET_NONBLOCKING)
        If Response <> 0 Then Error = Err.LastDllError: GoTo ERR_HANDLER
    End If
    m_IsBlocked = IsBlocked
Exit Property
ERR_HANDLER:
    Err.Raise Error, 'Socket:IsBlocked', ErrorDescription(Error)
End Property
0
0 / 0 / 0
Регистрация: 30.08.2007
Сообщений: 35
31.03.2008, 19:22  [ТС]
Вот спасибо за ответ - а то я уже думал на С++ писать придется...
Только вот что...
функция dd() создает сокет
скорее всего функция
IsBlocked (IsBlocked As Boolean)
выполняе комманду на сокете - я так понял устанавливает его тип - блокированный или нет...
только вот позвольте полениться - считывание и прием.передача данных так же через API ??? т.е. по проще никак нельзя ??? т.е. события к сокету привязять и т.д. ...
:-)
И где взять список комманд которые можно выполнять на сокете ?? в МСДН я чтото не все нашел ...
С уважением...
0
0 / 0 / 0
Регистрация: 20.02.2008
Сообщений: 181
31.03.2008, 20:01
1. да, dd() просто создаёт сокет ... dd() написал для бОльшей понятности. А то долго пришлось бы пояснять откуда взялся m_Socket в IsBlocked
2. ioctlsocket (для моего удобства названо WS_IOControl) так-же меняет и другие установки, но я их не использовал - подробнее в МСДН
3. 'считывание и прием.передача данных так же
через API ?' - не обязательно. Можно взять хэндл сокета из Winsock контрола и потом использовать его в API вызовах.
Но тут возникает некая неопределённость, которая мне лично не нравится. Неизвестно поведение контрола если менять установки вне его. Предпочитаю точно знать что происходит в моей программе (насколько это возможно в VB) а не думать /гадать 'а чего эта штуковина тут вытворяет ?'.
4. 'МСДН я чтото не все нашел' - трудно искать если неизвестно чего Тут у меня нету МСДН, но примерно: Windows network services в оглавлении. Или, для начала, в поиске набери 'ioctlsocket'.

Всё. Устал писать Вроде всё должно быть понятно ...
0
0 / 0 / 0
Регистрация: 30.08.2007
Сообщений: 35
31.03.2008, 23:09  [ТС]
Ага ясненько.
Только вот я не совсем понял как это, но скорее всего использовать 'событейную' модель сокета, и вызовы направлять на окно с хендлом Winsoc, т.е. фактически самому Winsock, а исходя из стандарта системных сообщений, то в случае какого то события на порту Winsock получит именно то сообщение которое нужно ??? ;-)
И эм-м-м я так глянул на часть программы
Public Enum SocketProtocol
SP_IP = 0
SP_ICMP = 1
SP_IGMP = 2
SP_GGP = 3
SP_TCP = 6
SP_PUP = 12
SP_UDP = 17
SP_IDP = 22
SP_ND = 77
SP_RAW = 255
SP_MAX = 256
End Enum

и э-э-э, часть я знаю, но большую половину нет ... к примеру RAW я только начал под него копать - как есть опыт работы ??? хочу написать свой шлюз под виндой 98. Т.е. чтоб в качестве шлюза использовать свой же ПК.
0
0 / 0 / 0
Регистрация: 20.02.2008
Сообщений: 181
02.04.2008, 11:27
'но скорее всего использовать 'событейную' модель сокета, и вызовы направлять на окно с хендлом Winsoc, т.е. фактически самому Winsock, а исходя из стандарта системных сообщений, то в случае какого то события на порту Winsock получит именно то сообщение которое нужно '

Ничего не понял из того что ты спросил
Хэндл сокета можно использовать для соединения с локальным/удалённым сокетом (для 'простых' - RAW, ICMP ... соединение не нужно), чтения, записи и.т.д. Если будешь использовать контрол, а не 'чистый' API то есть смысл использовать функции Winsodk API только для специфичных задач, не реализованных в контроле. Используя котрол, взять у него хэндл и потом получать-отправлять сообщения (что делает сам контрол) - похоже на извращение. IMHO
Изучайте матчасть, батенька В МСДН усё есть и каждая функция описана. Если конечно лень, можно и примеры поискать, но тогда труднее понять зачем всё это надо.

Успехов.
0
0 / 0 / 0
Регистрация: 30.08.2007
Сообщений: 35
07.04.2008, 16:17  [ТС]
Я к тому - что эм-м-м случаем нет опыта работы и вообще знаний относительно всех этих 'остальных' типов сокета??? то самому разбираться - времени жалко это ж не основная работа... вот думаю помощь была бы к стати...

С уважениме.
Жду ответа...

ЗЫ - сколько всего интересного ... :-)
0
0 / 0 / 0
Регистрация: 20.02.2008
Сообщений: 181
07.04.2008, 17:02
Это ты мудро придумал ) Только время штука такая - всем нехватает. так что придётся самому изучать.
vbip.com - там по ссылкам дальше пойдёшь ...
0
0 / 0 / 0
Регистрация: 20.02.2008
Сообщений: 181
07.04.2008, 17:31
Это ты мудро придумал ) Только время штука такая - всем нехватает. Так что придётся самому начала изучать. Чтоб представление какое было...
vbip.com - для базы самое то. Но на engl только. В .ру, по-моему, до таких сайтов не дошли...

Ну а если чего конкретно, завсегда пожалуйста - спрашивай.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.04.2008, 17:31
Помогаю со студенческими работами здесь

Неблокирующий сокет
Необходимо создать неблокирующий сокет, но нет об этом представления, если можно через call и cell Добавлено через 1 час 11 минут И...

Как открыть файл через сокет
Имеется программа которая запрашивает у пользователя имя и пароль и сверяется с базой данных(тестовый файл). Путь к этому текстовому...

Как открыть сокет через прокси сервер?
Помогите пожалуста: как как открыть сокет через прокси сервер? наверно сначала fsockopen до прокси, а затем как-то fsockopen до...

Открыть сервер сокет
Здравствуйте. У меня такой вопрос. Можно ли средствами AS3 открыть сервер сокет? Есть некий клиент игры и сервер на php. Сервер знает айпи...

Как только происходит попытка создать сокет для UDP - сокет TCP сразу ломается (выдает 10093).
Добрый день. Пытаюсь сделать соединение, использующее два канала обмена данными - TCP для управления в режиме клмиента, и UDP - для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru