0 / 0 / 0
Регистрация: 30.08.2007
Сообщений: 35

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

30.03.2008, 23:57. Показов 2792. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru