Страница: 1 |
Страница: 1 |
Вопрос: Несколько вопросов по WinSock
Добавлено: 06.05.08 13:06
Автор вопроса: PeterS
Для инициализации Winsock 'а версии 1.0 WS_VERSION_REQD должна быть равна &H100 и для 2.0 - &H200. Но почему при этих значениях функция WSAStartup возвращает ошибку?
Второе, в MSDN 'е сказано, что переменная szDescription должна быть длиной до 256 символов, а в примере от MS:
Private Const WSADescription_Len = 256
...
szDescription(0 To WSADescription_Len) As Byte
...
Получается szDescription длиной 257 символов. На один больше так?
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
shuffle
Администратор
ICQ: 201502381
Вопросов: 15
Ответов: 737
Профиль | | #1
Добавлено: 06.05.08 14:12
Второе, вероятно, обусловлено тем, что в С используются ASCIIZ-строки, для которых нужно отдельно выделять байт под \0.
Номер ответа: 2
Автор ответа:
PeterS
Вопросов: 24
Ответов: 109
Профиль | | #2
Добавлено: 06.05.08 14:16
А у нас VB, тогда нужен ли нам этот отдельный байт?
Номер ответа: 3
Автор ответа:
shuffle
Администратор
ICQ: 201502381
Вопросов: 15
Ответов: 737
Профиль | | #3
Добавлено: 06.05.08 14:18
WinAPI написал на С.
Номер ответа: 4
Автор ответа:
PeterS
Вопросов: 24
Ответов: 109
Профиль | | #4
Добавлено: 06.05.08 14:22
Ясно, спасибо, значит нужен.
А что с первым пунктом, кто-нибудь знает?
Номер ответа: 5
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #5
Добавлено: 06.05.08 14:36
Посмотри WSAGetLastError
Номер ответа: 6
Автор ответа:
PeterS
Вопросов: 24
Ответов: 109
Профиль | | #6
Добавлено: 06.05.08 18:45
WSAGetLastError возвращает 126, а WSAStartup - 10092. Что означает 10092 я нашёл, а про 126 ничего.
Номер ответа: 7
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #7
Добавлено: 06.05.08 19:03
ERROR_MOD_NOT_FOUND=126 - The specified module could not be found.
Номер ответа: 8
Автор ответа:
PeterS
Вопросов: 24
Ответов: 109
Профиль | | #8
Добавлено: 06.05.08 20:02
Что это даёт? Интересно, что за модуль не найден?
Номер ответа: 9
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #9
Добавлено: 06.05.08 21:46
Судя по
видимо WSAStartup не загружает Winsock, и юзать WSA функции низя (WSAGetLastError тоже).
Номер ответа: 10
Автор ответа:
PeterS
Вопросов: 24
Ответов: 109
Профиль | | #10
Добавлено: 07.05.08 18:50
Т.к. использовать функцию WSAGetLastError нельзя, то возвращаемся к ошибке 10092 WSAStartup.
В общем вот код, может кто у себя проверит:
Public Declare Function WSAStartup Lib "ws2_32" (ByVal wVersionRequired As _
Long, lpWSADATA As WSAData) As Long
' Освобождение WinSock'а
Public Declare Function WSACleanup Lib "ws2_32" () As Long
' Создание сокета
Public Declare Function socket Lib "ws2_32" (ByVal af As Long, ByVal s_type As _
Long, ByVal protocol As Long) As Long
Private Const MAX_WSADescription = 256
Private Const MAX_WSASYSStatus = 128
' Так работает
'Public Const WS_VERSION_REQD As Long = &H202 ' версия 2.2
' А так нет
[b]Public Const WS_VERSION_REQD As Long = &H200 ' версия 2.0[/b]
' для ф-и socket
Public Const PF_INET = 2
Public Const SOCK_STREAM = 1
Public Const IPPROTO_TCP = 6
Public Type WSAData
wVersion As Integer
wHighVersion As Integer
szDescription(0 To MAX_WSADescription) As Byte
szSystemStatus(0 To MAX_WSASYSStatus) As Byte
wMaxSockets As Integer
wMaxUDPDG As Integer
dwVendorInfo As Long
End Type
Function Init_sock() As Byte
Dim result As Long, WSAD As WSAData
result = WSAStartup(WS_VERSION_REQD, WSAD)
MsgBox result
End Function
Private Sub Form_Load()
Call Init_sock
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call WSACleanup
End Sub
Номер ответа: 11
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #11
Добавлено: 07.05.08 19:58
Правда это ошибка DM, но видимо то что надо.
http://westbyte.com/dm/index.phtml?page=faq_ec_ru
"10092 - Указанная версия Windows Sockets не поддерживается."
Непременно нужна версия 2.0?
Номер ответа: 12
Автор ответа:
PeterS
Вопросов: 24
Ответов: 109
Профиль | | #12
Добавлено: 07.05.08 22:55
Да, нужны версии 1.0 и 2.0.