如何解决无法在 VBA Excel 中使用 WinSock 的 connect()
我正在 Excel VBA 中测试套接字,但无法将套接字连接到我的测试服务器。
connect() 返回 -1,WSAGetLastError() 主要返回 0,但有时返回 5 或 10060。
我已经在 Java 上测试了这个简单的例子(连接、发送和接收),它可以在同一台 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 举报,一经查实,本站将立刻删除。