获取一个给定的IP地址和vba中的端口的套接字,用于winsock

问题描述

我需要能够从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 (将#修改为@)