Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba winsock connect函数仅在高速连接上工作_Vba_Vb6_Connection_Winsock - Fatal编程技术网

Vba winsock connect函数仅在高速连接上工作

Vba winsock connect函数仅在高速连接上工作,vba,vb6,connection,winsock,Vba,Vb6,Connection,Winsock,我正在VB6应用程序中使用winsock,这是我的代码: Private Sub Form_Load() With Winsock1 .Close .RemoteHost = Hostip .RemotePort = port number .Connect End With End Sub 我的问题是,当我使用高速连接(4G)时,连接工作正常,但使用其他连接(如3G、wise…)时,它会返回以下消息: 尝试连接超时 如何解决此问题?听起来

我正在VB6应用程序中使用
winsock
,这是我的代码:

Private Sub Form_Load()  

  With Winsock1  
    .Close  
    .RemoteHost = Hostip
    .RemotePort = port number
    .Connect
  End With
End Sub
我的问题是,当我使用高速连接(4G)时,连接工作正常,但使用其他连接(如3G、wise…)时,它会返回以下消息:

尝试连接超时


如何解决此问题?

听起来您需要设置更长的连接超时时间。无法直接使用控件执行此操作。下面是一篇退役知识库文章的修改示例。原始代码不包括SO_SNDTIMEO或SO_RCVTIMEO选项

Option Explicit

' Error returned by Winsock API.
Const SOCKET_ERROR = -1

' Level number for (get/set)sockopt() to apply to socket itself.
Const SOL_SOCKET = 65535      ' Options for socket level.
Const IPPROTO_TCP = 6         ' Protocol constant for TCP.

' option flags per socket
Const SO_DEBUG = &H1&         ' Turn on debugging info recording
Const SO_ACCEPTCONN = &H2&    ' Socket has had listen() - READ-ONLY.
Const SO_REUSEADDR = &H4&     ' Allow local address reuse.
Const SO_KEEPALIVE = &H8&     ' Keep connections alive.
Const SO_DONTROUTE = &H10&    ' Just use interface addresses.
Const SO_BROADCAST = &H20&    ' Permit sending of broadcast msgs.
Const SO_USELOOPBACK = &H40&  ' Bypass hardware when possible.
Const SO_LINGER = &H80&       ' Linger on close if data present.
Const SO_OOBINLINE = &H100&   ' Leave received OOB data in line.

Const SO_DONTLINGER = Not SO_LINGER
Const SO_EXCLUSIVEADDRUSE = Not SO_REUSEADDR ' Disallow local address reuse.

' Additional options.
Const SO_SNDBUF = &H1001&     ' Send buffer size.
Const SO_RCVBUF = &H1002&     ' Receive buffer size.
Const SO_ERROR = &H1007&      ' Get error status and clear.
Const SO_TYPE = &H1008&       ' Get socket type - READ-ONLY.

' TCP Options
Const TCP_NODELAY = &H1&      ' Turn off Nagel Algorithm.

' linger structure
Private Type LINGER_STRUCT
  l_onoff As Integer          ' Is linger on or off?
  l_linger As Integer         ' Linger timeout in seconds.
End Type

'timeout structure
Private Type TIMEOUT_STRUCT
    tv_sec As Long  'seconds
    tv_usec As Long 'milliseconds
End Type

'Timeout options
Const SO_SNDTIMEO = &H1005& 'send timeout
Const SO_RCVTIMEO = &H1006& 'receive timeout

' Winsock API declares
Private Declare Function setsockopt Lib "wsock32.dll" (ByVal s As Long, ByVal level As Long, ByVal optname As Long, optval As Any, ByVal optlen As Long) As Long
Private Declare Function getsockopt Lib "wsock32.dll" (ByVal s As Long, ByVal level As Long, ByVal optname As Long, optval As Any, optlen As Long) As Long

Private Sub Command1_Click()
  ' Read all the options and present in a message box.
  Dim socket As Long

  socket = Winsock1.SocketHandle

  If socket = 0 Then
    MsgBox "No Socket"
  Else
    MsgBox "Socket Options:" & vbCrLf & _
           "    SO_DEBUG: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_DEBUG)) & vbCrLf & _
           "    SO_ACCEPTCONN: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_ACCEPTCONN)) & vbCrLf & _
           "    SO_REUSEADDR: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_REUSEADDR)) & vbCrLf & _
           "    SO_KEEPALIVE: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_KEEPALIVE)) & vbCrLf & _
           "    SO_DONTROUTE: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_DONTROUTE)) & vbCrLf & _
           "    SO_BROADCAST: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_BROADCAST)) & vbCrLf & _
           "    SO_USELOOPBACK: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_USELOOPBACK)) & vbCrLf & _
           "    SO_LINGER: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_LINGER)) & vbCrLf & _
           "    SO_OOBINLINE: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_OOBINLINE)) & vbCrLf & _
           "    SO_DONTLINGER: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_DONTLINGER)) & vbCrLf & _
           "    SO_EXCLUSIVEADDRUSE: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_EXCLUSIVEADDRUSE)) & vbCrLf & _
           "    SO_SNDBUF: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_SNDBUF)) & vbCrLf & _
           "    SO_RCVBUF: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_RCVBUF)) & vbCrLf & _
           "    SO_ERROR: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_ERROR)) & vbCrLf & _
           "    SO_TYPE: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_TYPE)) & vbCrLf & vbCrLf & _
           "TCP Options:" & vbCrLf & _
           "    TCP_NODELAY: " & CStr(GetSocketOption(socket, IPPROTO_TCP, TCP_NODELAY))
    End If
End Sub

Private Sub Command2_Click()
  Dim lResult As Long     ' Results of 1st option.
  Dim tout As TIMEOUT_STRUCT

  If (Winsock1.Protocol = sckTCPProtocol) Then
    tout.tv_sec = 10
    tout.tv_usec = 0

    lResult = setsockopt(Winsock1.SocketHandle, SOL_SOCKET, SO_SNDTIMEO, tout, LenB(tout))

    If (lResult = SOCKET_ERROR) Then
      MsgBox "Error setting SO_SNDTIMEO option: " & Translate_DLL_Error(Err.LastDllError)
    Else
      MsgBox "SO_SNDTIMEO option set."
    End If

  End If

End Sub

Public Function GetSocketOption(lSocket As Long, lLevel As Long, lOption As Long) As Long
  Dim lResult As Long       ' Result of API call.
  Dim lBuffer As Long       ' Buffer to get value into.
  Dim lBufferLen As Long    ' len of buffer.
  Dim linger As LINGER_STRUCT

  ' Linger requires a structure so we will get that option differently.
  If (lOption <> SO_LINGER) And (lOption <> SO_DONTLINGER) Then
    lBufferLen = LenB(lBuffer)
    lResult = getsockopt(lSocket, lLevel, lOption, lBuffer, lBufferLen)
  Else
    lBufferLen = LenB(linger)
    lResult = getsockopt(lSocket, lLevel, lOption, linger, lBufferLen)
    lBuffer = linger.l_onoff
  End If

  If (lResult = SOCKET_ERROR) Then
    GetSocketOption = Err.LastDllError
  Else
    GetSocketOption = lBuffer
  End If
End Function

Private Sub Form_Load()
  Winsock1.Bind 8377      ' Set up socket enough to get nonzero socket. handle
End Sub
选项显式
'Winsock API返回的错误。
常量套接字错误=-1
'要应用于套接字本身的(get/set)sockopt()的级别号。
Const SOL_SOCKET=65535'插座级别选项。
常量IPPROTO_TCP=TCP的6'协议常数。
'每个套接字的选项标志
Const SO_DEBUG=&H1&'打开调试信息录制
Const SO_ACCEPTCONN=&H2&'套接字具有listen()-只读。
Const SO_REUSEADDR=&H4&'允许本地地址重用。
Const SO_KEEPALIVE=&H8&'保持连接活动。
Const SO_DONTROUTE=&H10&'只需使用接口地址即可。
Const SO_BROADCAST=&H20&'允许发送广播MSG。
Const SO_USELOOPBACK=&H40&'尽可能绕过硬件。
Const SO_LINGER=&H80&“如果存在数据,则在关闭时徘徊”。
Const SO_OOBINLINE=&H100&'将收到的OOB数据保留在行中。
Const SO_DONTLINGER=并非如此徘徊
Const SO_exclusiveReadDruse=不允许本地地址重用。
“其他选择。
Const SO_SNDBUF=&H1001&“发送缓冲区大小”。
Const SO_RCVBUF=&H1002&“接收缓冲区大小”。
Const SO_ERROR=&H1007&'获取错误状态并清除。
Const SO_TYPE=&H1008&'Get套接字类型-只读。
'TCP选项
Const TCP_NODELAY=&H1&'关闭Nagel算法。
“徘徊结构”
私有类型LINGER\u结构
l_onoff As Integer'是启用还是禁用?
l_linger作为整数“以秒为单位的linger超时。
端型
'超时结构
私有类型超时\u结构
电视秒长为“秒”
电视节目长度为“毫秒”
端型
'超时选项
Const SO_SNDTIMEO=&H1005&'send timeout
Const SO_RCVTIMEO=&H1006&'receive timeout
'Winsock API声明
私有声明函数setsockopt Lib“wsock32.dll”(ByVal s为Long,ByVal level为Long,ByVal optname为Long,optval为Any,ByVal optlen为Long)为Long
私有声明函数getsockopt Lib“wsock32.dll”(ByVal s为Long,ByVal level为Long,ByVal optname为Long,optval为Any,optlen为Long)为Long
专用子命令1_Click()
'阅读所有选项并显示在消息框中。
暗插座一样长
socket=Winsock1.SocketHandle
如果套接字=0,则
MsgBox“无插座”
其他的
MsgBox“套接字选项:”&vbCrLf&_
“SO_DEBUG:”&CStr(GetSocketOption(socket,SOL_socket,SO_DEBUG))&vbCrLf&_
“SO_ACCEPTCONN:”&CStr(GetSocketOption(socket,SOL_socket,SO_ACCEPTCONN))&vbCrLf&_
“SO_REUSEADDR:”&CStr(GetSocketOption(socket,SOL_socket,SO_REUSEADDR))&vbCrLf&_
“SO_KEEPALIVE:”&CStr(GetSocketOption(socket,SOL_socket,SO_KEEPALIVE))&vbCrLf&_
“SO_DONTROUTE:”&CStr(GetSocketOption(socket,SOL_socket,SO_DONTROUTE))&vbCrLf&_
“SO_广播:”&CStr(GetSocketOption(socket、SOL_socket、SO_广播))&vbCrLf&_
“SO_uselopback:”&CStr(GetSocketOption(socket,SOL_socket,SO_uselopback))&vbCrLf&_
“SO_LINGER:”&CStr(GetSocketOption(socket,SOL_socket,SO_LINGER))&vbCrLf&_
“SO_OOBINLINE:”&CStr(GetSocketOption(socket,SOL_socket,SO_OOBINLINE))&vbCrLf&_
“SO_DONTLINGER:”&CStr(GetSocketOption(socket,SOL_socket,SO_DONTLINGER))&vbCrLf&_
“SO_ExclusiveAdruse:”&CStr(GetSocketOption(socket,SOL_socket,SO_ExclusiveAdruse))&vbCrLf&_
“sou SNDBUF:”&CStr(GetSocketOption(socket,SOL_socket,sou SNDBUF))&vbCrLf&_
“SO_RCVBUF:”&CStr(GetSocketOption(socket,SOL_socket,SO_RCVBUF))&vbCrLf&_
“SO_错误:”&CStr(GetSocketOption(socket,SOL_socket,SO_错误))&vbCrLf&_
“SO类型:”&CStr(GetSocketOption(socket,SOL_socket,SO类型))&vbCrLf&vbCrLf&_
“TCP选项:”&vbCrLf&_
“TCP\u节点延迟:”&CStr(GetSocketOption(套接字、IPPROTO\u TCP、TCP\u节点延迟))
如果结束
端接头
专用子命令2_Click()
Dim lResult作为第一个选项的“长”结果。
Dim tout作为超时结构
如果(Winsock1.Protocol=sckTCPProtocol),则
tout.tv_sec=10
tout.tv_usec=0
lResult=setsockopt(Winsock1.SocketHandle,SOL_SOCKET,SO_SNDTIMEO,tout,LenB(tout))
如果(lResult=SOCKET\u错误),则
MsgBox“错误设置SO\u SNDTIMEO选项:”&Translate\u DLL\u错误(Err.LastDllError)
其他的
MsgBox“SO_SNDTIMEO选项集”
如果结束
如果结束
端接头
公共函数GetSocketOption(lSocket尽可能长,lLevel尽可能长,lOption尽可能长)尽可能长
Dim lResult作为API调用的“Long”结果。
将lBuffer设置为长缓冲区以获取值。
缓冲区的长度等于缓冲区的长度。
模糊的逗留作为逗留结构
Linger需要一个结构,因此我们将以不同的方式获得该选项。
如果(lOption SO_LINGER)和(lOption SO_DONTLINGER),那么
lBufferLen=LenB(lBuffer)
lResult=getsockopt(lSocket、lLevel、lOption、lBuffer、lBufferLen)
其他的
lBufferLen=LenB(玲珑)
lResult=getsockopt(lSocket、lLevel、lOption、linger、lBufferLen)
lBuffer=linger.l_onoff
如果结束
如果(lResult=SOCKET\u错误),则
GetSocketOption=Err.LastDllError
其他的
GetSocketOption=lBuffer
如果结束
端函数
专用子表单_加载()
Winsock1.Bind 8377'设置足够的套接字以获取非零套接字。手柄
端接头
你可以在<