vb以二进制打开excel后用winsock发送,结果接收后打开的是乱码,发送别的文件没问题,为啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vb以二进制打开excel后用winsock发送,结果接收后打开的是乱码,发送别的文件没问题,为啥?相关的知识,希望对你有一定的参考价值。

发送端
Dim allziliao() As Byte
Dim pathn As String
Dim lenth As String
pathn = "d:\my.xls"
Open pathn For Binary As #1
lenth = LOF(1)
ReDim allziliao(lenth - 1)
Get #1, , allziliao()
Close #1
Winsock2.SendData allziliao()
接收端
Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
MsgBox "winsock2有数据来了"
Dim allziliao() As Byte
Dim pathn As String
pathn = "d:\my.xls"
Winsock2.GetData allziliao(), vbByte + vbArray
Open pathn For Binary As #1
lenth = LOF(1)
If lenth > 0 Then Seek 1, lenth + 1
Put #1, , allziliao()
Close #1
End Sub

参考技术A 不懂得这个打

VB6 Winsock 能够发送非常大的有效载荷

【中文标题】VB6 Winsock 能够发送非常大的有效载荷【英文标题】:VB6 Winsock capable of sending very large payloads 【发布时间】:2012-07-30 13:54:56 【问题描述】:

我正在向基本的 .NET 异步套接字服务器添加文件共享功能。我希望客户端发送的有效负载只是我的 headers+commandID+binaryFileData。除了 .NET 客户端之外,此服务器还需要为来自 VB6 客户端的请求提供服务。

负责 VB6 客户端的一方想出了一种复杂的方式来传输文件,我对此并不特别印象深刻。它涉及发送文件的一小块,最后服务器请求下一个块。该方声称,如果您尝试使用大发送(“大”表示任何不小——1MB 是“大”),VB6 Winsock 控件将无法正常工作。这对我来说听起来很荒谬。

我希望客户端将单个大负载写入套接字,然后在服务器端进行消息重组/散列。 VB6 Winsock控件大写真的有问题,还是对方找借口?

【问题讨论】:

【参考方案1】:

不,Winsock 和套接字控件没有文件或大小的概念,只有字节流。我希望他们达到缓冲区大小,在这种情况下,他们只需要分块发送,直到全部发送。服务器无需请求下一个块,这只会减慢速度。

【讨论】:

我同意,根本不存在“大负载”问题。【参考方案2】:

关于 VB6 对大(对于大的小值)有效载荷存在问题的说法是绝对正确的。更重要的是,由此产生的问题因安装和月相而异。将超过一个 MB 发送到 VB6 winsock 控件是自找麻烦。去过那里,做到了,相信我。

也就是说,我们采用了另一条路线:一个函数将接受任意大小的有效负载,将其分块为兆字节并将其排入队列。 winsock 控制事件 (SendCompleteIIRC) 将用于出列下一个兆字节。

这对消费应用程序是透明的(一个单独的调用,与有效负载大小无关),在发送端解决了问题 - 这在没有任何复杂协议的情况下可靠地工作,因为问题完全在客户端内部。

【讨论】:

对服务器来说,这似乎都在同一个 TCP 会话上吗? IE。每个块不像开始会话-> 发送块-> 关闭会话?请原谅我对 VB6 的无知,这是一个显而易见的问题。 TCP“会话”?如果你的意思是连接,是的,它是一样的。客户端上的“块”不会出现在服务器上,它会随时接收从 1 字节块到整个文件的任何数量的数据。 只是为了说明这一点:我不是在谈论重复连接,而是在同一连接上重复发送。服务器甚至都不知道(如果他不主动尝试)

以上是关于vb以二进制打开excel后用winsock发送,结果接收后打开的是乱码,发送别的文件没问题,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

winsock多IP发送数据vb6

VB6 应用程序通过 winsock 发送 UDP 广播消息 - 仅每秒发送一次消息

vb6 - 将消息发送到winsock服务器聊天

VB6:如何获取通过 winsock 发送的字节数?

Excel 在VBA中可否调用winsock控件

使用 vb6 winsock 发送 python 字符串