问题描述
我需要能够从MS Access vba内部向tcp地址(例如127.0.0.1:123456)发送简单的字符串消息。
我已经找到了使用winsock的示例,它看起来应该可以工作,并且在将作用域和可编译类型的函数的作用域更改为private之后,但是我不知道如何获取IP地址和端口号的套接字
下面是代码,但不清楚如何使用ip地址和端口号获取套接字ID。
Const INVALID_SOCKET = -1
Const WSADESCRIPTION_LEN = 256
Enum AF
AF_UNSPEC = 0
AF_INET = 2
AF_IPX = 6
AF_APPLETALK = 16
AF_NETBIOS = 17
AF_INET6 = 23
AF_IRDA = 26
AF_BTH = 32
End Enum
Enum sock_type
SOCK_STREAM = 1
SOCK_DGRAM = 2
SOCK_RAW = 3
SOCK_RDM = 4
SOCK_SEQPACKET = 5
End Enum
Enum Protocol
IPPROTO_ICMP = 1
IPPROTO_IGMP = 2
BTHPROTO_RFCOMM = 3
IPPROTO_TCP = 6
IPPROTO_UDP = 17
IPPROTO_ICMPV6 = 58
IPPROTO_RM = 113
End Enum
Type sockaddr
sa_family As Integer
sa_data(0 To 13) As Byte
End Type
Type sockaddr_in
sin_family As Integer
sin_port As Integer
sin_addr(0 To 3) As Byte
sin_zero(0 To 7) As Byte
End Type
'typedef UINT_PTR SOCKET;
Type socket
pointer As Long
End Type
' typedef struct WSAData {
' WORD wVersion;
' WORD wHighVersion;
' char szDescription[WSADESCRIPTION_LEN+1];
' char szSystemStatus[WSASYS_STATUS_LEN+1];
' unsigned short iMaxSockets;
' unsigned short iMaxUdpDg;
' char FAR *lpvendorInfo;
'} WSADATA,*LPWSADATA;
Type LPWSADATA_Type
wVersion As Integer
wHighVersion As Integer
szDescription(0 To WSADESCRIPTION_LEN) As Byte
szSystemStatus(0 To WSADESCRIPTION_LEN) As Byte
iMaxSockets As Integer
iMaxUdpDg As Integer
lpvendorInfo As Long
End Type
'int errorno = WSAGetLastError()
Public Declare Function WSAGetLastError Lib "Ws2_32.dll" _
() As Integer
' int WSAStartup(
' __in WORD wVersionRequested,' __out LPWSADATA lpWSAData
');
Public Declare Function WSAStartup Lib "Ws2_32.dll" _
(ByVal wVersionRequested As Integer,ByRef lpWSAData As LPWSADATA_Type) As Long
'int sendto(
' __in SOCKET s,' __in const char *buf,' __in int len,' __in int flags,' __in const struct sockaddr *to,' __in int tolen
');
Public Declare Function sendto Lib "Ws2_32.dll" _
(ByVal socket As Long,ByRef buf() As Byte,_
ByVal length As Long,ByVal flags As Long,_
ByRef toaddr As sockaddr_in,tolen As Long) As Long
' SOCKET WSAAPI socket(
' __in int af,' __in int type,' __in int protocol
');
Public Declare Function f_socket Lib "Ws2_32.dll" Alias "socket" _
(ByVal AF As Long,ByVal stype As Long,ByVal Protocol As Long) As Long
Public Declare Function closesocket Lib "Ws2_32.dll" _
(ByVal socket As Long) As Long
Public Declare Sub WSACleanup Lib "Ws2_32.dll" ()
Sub main()
Dim ConnectSocket As socket
Dim wsaData As LPWSADATA_Type
Dim iResult As Integer
iResult = 0
Dim send_sock As sock_type
send_sock = INVALID_SOCKET
Dim iFamily As AF
iFamily = AF_INET
Dim iType As Integer
iType = SOCK_DGRAM
Dim iProtocol As Integer
iProtocol = IPPROTO_UDP
Dim SendBuf(0 To 1023) As Byte
Dim BufLen As Integer
BufLen = 1024
Dim RecvAddr As sockaddr_in
RecvAddr.sin_family = AF_INET
RecvAddr.sin_port = 23
RecvAddr.sin_addr(0) = 192
RecvAddr.sin_addr(1) = 168
RecvAddr.sin_addr(2) = 1
RecvAddr.sin_addr(3) = 30
SendBuf(0) = 65
SendBuf(1) = 66
SendBuf(2) = 67
SendBuf(3) = 0
iResult = WSAStartup(&H202,wsaData)
If iResult <> 0 Then
MsgBox ("WSAStartup Failed: " & iResult)
Exit Sub
End If
send_sock = f_socket(iFamily,iType,iProtocol)
If send_sock = INVALID_SOCKET Then
Errno = WSAGetLastError()
Exit Sub
End If
iResult = sendto(send_sock,_
SendBuf,BufLen,RecvAddr,Len(RecvAddr))
If iResult = -1 Then
MsgBox ("sendto Failed with error: " & WSAGetLastError())
closesocket (SendSocket)
Call WSACleanup
Exit Sub
End If
iResult = closesocket(send_sock)
If iResult <> 0 Then
MsgBox ("closesocket Failed with error : " & WSAGetLastError())
Call WSACleanup
End If
End Sub
任何人都可以解释一下如何使用它来发送字符串消息吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)