微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法在 VBA Excel 中使用 WinSock 的 connect()

如何解决无法在 VBA Excel 中使用 WinSock 的 connect()

我正在 Excel VBA 中测试套接字,但无法将套接字连接到我的测试服务器。

connect() 返回 -1,WSAGetLastError() 主要返回 0,但有时返回 5 或 10060。

我已经在 J​​ava 上测试了这个简单的例子(连接、发送和接收),它可以在同一台 PC 上运行(两台 PC 在同一网络上)。也就是说,我知道服务器正在工作,网络正在工作(防火墙、ip_address、端口等)

这里是测试代码修改自我从 te web 上得到的一个例子...

我在 Windows 10 上使用 Excel 2010

我需要帮助找出错误。请帮忙。谢谢!

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

Enum ShutdownSD
   SD_RECEIVE = 0
   SD_SEND = 1
   SD_BOTH = 2
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

Type socket
   pointer As Long
End Type

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

Public Declare PtrSafe Function WSAGetLastError Lib "Ws2_32.dll" _
   () As Long
   
Public Declare PtrSafe Function WSAStartup Lib "Ws2_32.dll" _
    (ByVal wVersionRequested As Integer,ByRef lpWSAData As LPWSADATA_Type) As Long


Public Declare PtrSafe Function send Lib "Ws2_32.dll" _
    (ByVal socket As Long,ByRef Buf() As Byte,_
     ByVal length As Long,ByVal flags As Long) As Long

Public Declare PtrSafe Function recv Lib "Ws2_32.dll" _
    (ByVal socket As Long,ByVal flags As Long) As Long

Public Declare PtrSafe 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 PtrSafe Function closesocket Lib "Ws2_32.dll" _
    (ByVal socket As Long) As Long
    
Public Declare PtrSafe Sub WSACleanup Lib "Ws2_32.dll" ()

Public Declare PtrSafe Function connect Lib "Ws2_32.dll" _
    (ByVal socket As Long,ByRef toaddr As sockaddr_in,tolen As Long) As Long

Public Declare PtrSafe Function shutdown Lib "Ws2_32.dll" _
    (ByVal socket As Long,ByVal how As Long) As Long



Public Declare PtrSafe Function inet_addr Lib "Ws2_32.dll" _
    (ByRef dp()) As Long

Public Declare PtrSafe Function htons Lib "Ws2_32.dll" _
    (ByVal x As Integer) As Integer


Sub Sockettest()


    Dim iResult As Long
    Dim wsaData As LPWSADATA_Type
    Dim cSocket As sock_type
    Dim sAddr As sockaddr_in
    
    Dim Buf(0 To 256) As Byte
    Dim BufLen As Integer
    Dim rLen As Integer,sLen As Integer
    
    Dim Line As String
       
    
    iResult = WSAStartup(&H202,wsaData)
    If iResult <> 0 Then
       MsgBox ("WSAStartup Failed. Returned : " & iResult)
       Exit Sub
    End If
    

    cSocket = f_socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
    If cSocket = INVALID_SOCKET Then
        MsgBox ("f_socket Failed with error: " & WSAGetLastError())
        Call WSACleanup
        Exit Sub
    End If
    
    
    sAddr.sin_family = AF_INET
    sAddr.sin_port = htons(1250)
    sAddr.sin_addr(0) = 192
    sAddr.sin_addr(1) = 168
    sAddr.sin_addr(2) = 1
    sAddr.sin_addr(3) = 98
    
    iResult = connect(cSocket,sAddr,Len(sAddr))
    If iResult < 0 Then
        MsgBox ("connect Failed with error: " & WSAGetLastError())
        closesocket (cSocket)
        WSACleanup
        Exit Sub
    End If
    
    
    
    Line = "Client.MiradorDelLago.001"
    For i = 1 To Len(Line)
        Buf(i - 1) = Asc(Mid(Line,i,1))
    Next i
    sLen = Len(Line)
    
    
    iResult = send(cSocket,Buf,sLen,0)
    If iResult < 0 Then
        MsgBox ("send Failed with error: " & WSAGetLastError())
        closesocket (cSocket)
        WSACleanup
        Exit Sub
    End If
      
      
      
    
    BufLen = 256
    rLen = recv(cSocket,BufLen,0)
    If rLen < 0 Then
        MsgBox ("recv Failed with error: " & WSAGetLastError())
        closesocket (cSocket)
        WSACleanup
        Exit Sub
    End If
    If rLen = 0 Then
        MsgBox ("Connection refused by server!")
        closesocket (cSocket)
        WSACleanup
        Exit Sub
    End If
    
    
    Line = ""
    For i = 0 To rLen - 1
        Line = Line & Chr(Buf(i))
    Next i
    MsgBox "Node number = " & Val(Line)
    
    
    
    iResult = shutdown(cSocket,SD_SEND)
    If iResult < 0 Then
       MsgBox ("shutdown Failed with error: " & WSAGetLastError())
       WSACleanup
    End If
    
    iResult = closesocket(cSocket)
    If iResult < 0 Then
       MsgBox ("closesocket Failed with error: " & WSAGetLastError())
       WSACleanup
    End If

End Sub

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。