VB6 Winsock 能够发送非常大的有效载荷
Posted
技术标签:
【中文标题】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 控制事件 (SendComplete
IIRC) 将用于出列下一个兆字节。
这对消费应用程序是透明的(一个单独的调用,与有效负载大小无关),在发送端解决了问题 - 这在没有任何复杂协议的情况下可靠地工作,因为问题完全在客户端内部。
【讨论】:
对服务器来说,这似乎都在同一个 TCP 会话上吗? IE。每个块不像开始会话-> 发送块-> 关闭会话?请原谅我对 VB6 的无知,这是一个显而易见的问题。 TCP“会话”?如果你的意思是连接,是的,它是一样的。客户端上的“块”不会出现在服务器上,它会随时接收从 1 字节块到整个文件的任何数量的数据。 只是为了说明这一点:我不是在谈论重复连接,而是在同一连接上重复发送。服务器甚至都不知道(如果他不主动尝试)以上是关于VB6 Winsock 能够发送非常大的有效载荷的主要内容,如果未能解决你的问题,请参考以下文章
VB6 应用程序通过 winsock 发送 UDP 广播消息 - 仅每秒发送一次消息