#sockets #ms-access
Вопрос:
Я использую VBA в Microsoft Access для подключения к IP-адресу и порту гаджета, коды или функции подключения и отправки VBA работают нормально, но функция приема VBA блокирует мой компьютер и заставляет его перестать отвечать. Поэтому я не могу получить результат от гаджета, и поэтому мне нужна ваша помощь. Как только я разберусь с этим, это поможет мне достичь моей цели.
Ниже приведена структура получающего кода VBA, который не получает данные:
Public Function RecvAscii(dataBuf As String, ByVal maxLength As Integer) As Integer
Dim count As Long
Dim c As String * 30720
Dim length As Integer
dataBuf = "30720"
While length < maxLength
DoEvents
count = recv(socketId, c, 30720, 0)
If count < 1 Then
RecvAscii = RECV_ERROR
dataBuf = Chr$(0)
Exit Function
End If
If c = Chr$(10) Then
dataBuf = dataBuf Chr$(0)
RecvAscii = NO_ERROR
Exit Function
End If
length = length count
dataBuf = dataBuf c
Wend
RecvAscii = RECV_ERROR
End Function
Ниже приведен код VBA, который я использую для вызова вышеуказанной функции для получения данных:
Private Sub CmdCread_Click()
Dim x As Long
Dim strData As String * 30720
Call OpenSocket("192.168.1.197", 8888)
' Read maximum of 30720 bytes from TCP/IP Port.Please note 30720 = buffer while 30720 = Length
x = RecvAscii(strData, 30720)
End Sub
Я также включил модуль VBA Bas, который предназначен для оказания помощи в работе вышеупомянутой функции приема VBA:
Type Hostent
h_name As Long
h_aliases As Long
h_addrtype As String * 2
h_length As String * 2
h_addr_list As Long
End Type
Public Const SZHOSTENT = 16
'Set the Internet address type to a long integer (32-bit)
Type in_addr
s_addr As Long
End Type
'A note to those familiar with the C header file for Winsock
'Visual Basic does not permit a user-defined variable type
'to be used as a return structure. In the case of the
'variable definition below, sin_addr must
'be declared as a long integer rather than the user-defined
'variable type of in_addr.
Type sockaddr_in
sin_family As Integer
sin_port As Integer
sin_addr As Long
sin_zero As String * 8
End Type
Public Const WSADESCRIPTION_LEN = 256
Public Const WSASYS_STATUS_LEN = 128
Public Const WSA_DescriptionSize = WSADESCRIPTION_LEN 1
Public Const WSA_SysStatusSize = WSASYS_STATUS_LEN 1
'Setup the structure for the information returned from
'the WSAStartup() function.
Type WSAData
wVersion As Integer
wHighVersion As Integer
szDescription As String * WSA_DescriptionSize
szSystemStatus As String * WSA_SysStatusSize
iMaxSockets As Integer
iMaxUdpDg As Integer
lpVendorInfo As String * 200
End Type
'Define socket return codes
Public Const INVALID_SOCKET = amp;HFFFF
Public Const SOCKET_ERROR = -1
'Define socket types
Public Const SOCK_STREAM = 1 'Stream socket
Public Const SOCK_DGRAM = 2 'Datagram socket
Public Const SOCK_RAW = 3 'Raw data socket
Public Const SOCK_RDM = 4 'Reliable Delivery socket
Public Const SOCK_SEQPACKET = 5 'Sequenced Packet socket
'Define address families
Public Const AF_UNSPEC = 0 'unspecified
Public Const AF_UNIX = 1 'local to host (pipes, portals)
Public Const AF_INET = 2 'internetwork: UDP, TCP, etc.
Public Const AF_IMPLINK = 3 'arpanet imp addresses
Public Const AF_PUP = 4 'pup protocols: e.g. BSP
Public Const AF_CHAOS = 5 'mit CHAOS protocols
Public Const AF_NS = 6 'XEROX NS protocols
Public Const AF_ISO = 7 'ISO protocols
Public Const AF_OSI = AF_ISO 'OSI is ISO
Public Const AF_ECMA = 8 'european computer manufacturers
Public Const AF_DATAKIT = 9 'datakit protocols
Public Const AF_CCITT = 10 'CCITT protocols, X.25 etc
Public Const AF_SNA = 11 'IBM SNA
Public Const AF_DECnet = 12 'DECnet
Public Const AF_DLI = 13 'Direct data link interface
Public Const AF_LAT = 14 'LAT
Public Const AF_HYLINK = 15 'NSC Hyperchannel
Public Const AF_APPLETALK = 16 'AppleTalk
Public Const AF_NETBIOS = 17 'NetBios-style addresses
Public Const AF_MAX = 18 'Maximum # of address families
'Setup sockaddr data type to store Internet addresses
Type sockaddr
sa_family As Integer
sa_data As String * 14
End Type
Public Const SADDRLEN = 16
'Declare Socket functions
Public Declare PtrSafe Function closesocket Lib "wsock32.dll" (ByVal s As LongPtr) As Long
Public Declare PtrSafe Function connect Lib "wsock32.dll" (ByVal s As LongPtr, addr As sockaddr_in, ByVal namelen As Long) As Long
Public Declare PtrSafe Function htons Lib "wsock32.dll" (ByVal hostshort As LongPtr) As Integer
Public Declare PtrSafe Function inet_addr Lib "wsock32.dll" (ByVal cp As String) As Long
Public Declare PtrSafe Function recv Lib "wsock32.dll" (ByVal s As LongPtr, ByVal buf As Any, ByVal buflen As LongPtr, ByVal flags As LongPtr) As Long
Public Declare PtrSafe Function recvB Lib "wsock32.dll" Alias "recv" (ByVal s As LongPtr, buf As Any, ByVal buflen As LongPtr, ByVal flags As LongPtr) As Long
Public Declare PtrSafe Function send Lib "wsock32.dll" (ByVal s As LongPtr, buf As Any, ByVal buflen As LongPtr, ByVal flags As LongPtr) As Long
Public Declare PtrSafe Function socket Lib "wsock32.dll" (ByVal af As LongPtr, ByVal socktype As LongPtr, ByVal protocol As LongPtr) As Long
Public Declare PtrSafe Function WSAStartup Lib "wsock32.dll" (ByVal wVersionRequired As LongPtr, lpWSAData As WSAData) As Long
Public Declare PtrSafe Function WSACleanup Lib "wsock32.dll" () As Long
Public Declare PtrSafe Function WSAUnhookBlockingHook Lib "wsock32.dll" () As Long
Public Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As LongPtr)