7,762
社区成员
发帖
与我相关
我的任务
分享
Dim lResult As Long
Dim bufSize As Long
bufSize = CLng(1024) * 1024
lResult = setsockopt(Winsock1.SocketHandle, SOL_SOCKET, SO_RCVBUF, bufSize, 4)
If (lResult = SOCKET_ERROR) Then
MsgBox "Error setting SO_RCVBUF option: " & CStr(Err.LastDllError)
End If
lResult = setsockopt(Winsock1.SocketHandle, SOL_SOCKET, SO_SNDBUF, bufSize, 4)
If (lResult = SOCKET_ERROR) Then
MsgBox "Error setting SO_SNDBUF option: " & CStr(Err.LastDllError)
End If
bufSize = 0
lResult = getsockopt(Winsock1.SocketHandle, SOL_SOCKET, SO_RCVBUF, bufSize, 4)
If (lResult = SOCKET_ERROR) Then
MsgBox "Error getting SO_RCVBUF option: " & CStr(Err.LastDllError)
End If
'bufSize=1024*1024,说明设置成功
'==============================================================================
'类方法定义及处理过程
'==============================================================================
'********************************************************************************
'** 方 法 名 : SendData
'** 输 入 : data(Variant) - 要通过Sock发送的任何类型数据内容
'** 返 回 : 无
'** 功能描述 : 发送网络数据
'********************************************************************************
Public Sub SendData(data As Variant)
Dim SendBuffers() As Byte
Dim SendBuffersSize As Long
Dim CancelERR As Boolean
Dim DataSize As Long
Dim SockSendCount As Long
Dim SockSendBuffers() As Byte
Dim rd As Long
'将要发送的数据进行字节流格式化
Select Case VarType(data)
Case vbString: SendBuffers = StrConv(data, vbFromUnicode)
Case vbArray + vbByte:
SendBuffers = data
End Select
SendBuffersSize = UBound(SendBuffers) + 1
'取得发送缓冲区大小
rd = api_getsockopt(mvarSocketHandle, _
SOL_SOCKET, _
SO_SNDBUF, _
DataSize, _
4)
If rd = SOCKET_ERROR Then
CancelERR = False
RaiseEvent SockError(35756, _
"不能完成请求。", _
0, _
"WinSock.SendData.getsockopt", _
"", _
0, _
CancelERR)
If CancelERR = False Then
Err.Raise vbObjectError + 35756, "不能完成请求。", 35756, "", 0
End If
Exit Sub
End If
'发送TCP数据
SendMaxSize = DataSize
SendNowSize = 0
If SendBuffersSize <= DataSize Then
'发送的内容小于或等于Sock发送缓冲区的大小,所以进行一次性发送数据
rd = api_send(mvarSocketHandle, SendBuffers(0), SendBuffersSize, 0&)
If rd = SOCKET_ERROR Then
mvarState = sckError
CancelERR = False
RaiseEvent SockError(35756, _
"不能完成请求。", _
0, _
"WinSock.SendData.send", _
"", _
0, _
CancelERR)
If CancelERR = False Then
Err.Raise vbObjectError + 35756, "不能完成请求。", 35756, "", 0
End If
Exit Sub
End If
RaiseEvent SendComplete
Else
'自动分包发送数据
SockSendCount = 0
SendMaxSize = SendBuffersSize
ReDim SockSendBuffers(DataSize - 1)
Do
CopyMemory SockSendBuffers(0), SendBuffers(SockSendCount), DataSize
AfreshSendData:
rd = api_send(mvarSocketHandle, SockSendBuffers(0), DataSize, 0&)
If rd = SOCKET_ERROR Then
'出错重发
GoTo AfreshSendData
ElseIf rd = DataSize Then
'发送成功
Else
mvarState = sckError
CancelERR = False
RaiseEvent SockError(35756, _
"不能完成请求。", _
0, _
"WinSock.SendData.send", _
"", _
0, _
CancelERR)
If CancelERR = False Then
Err.Raise vbObjectError + 35756, "不能完成请求。", 35756, "", 0
End If
Exit Sub
End If
SockSendCount = SockSendCount + DataSize
SendNowSize = SockSendCount
'RaiseEvent SendProgress(SendNowSize, SendBuffersSize)
If SockSendCount >= SendBuffersSize Then
DataSize = 0
Else
If SockSendCount + DataSize >= SendBuffersSize Then
DataSize = (SendBuffersSize - SockSendCount)
End If
End If
Loop While DataSize > 0
RaiseEvent SendComplete
End If
End Sub