【发布时间】:2010-12-02 13:54:33
【问题描述】:
我想通过winsock发送文件(文本或二进制),我有一个32768字节大小的缓冲区,另一边的缓冲区大小相同,但是当数据包大小
【问题讨论】:
我想通过winsock发送文件(文本或二进制),我有一个32768字节大小的缓冲区,另一边的缓冲区大小相同,但是当数据包大小
【问题讨论】:
对于固定大小的“数据包”,我们通常会认为除了最后一个数据包之外的每个数据包都将完全充满有效数据。只有最后一个是“部分的”,并且如果收件人知道需要多少字节(因为使用 Davita 的建议,发件人提前告诉了它文件大小),那没问题。接收者可以简单地忽略最后一个数据包的剩余部分。
但是您的进一步描述听起来好像有多个与单个文件传输相关联的部分完整数据包。有一个类似的简单解决方案:在每个数据包前加上有效字节数。
你稍后提到TCustomWinSocket.ReceiveText,你想知道它是如何知道要读取多少文本的,然后你引用答案,即它在填充之前调用ReceiveBuf(Pointer(nul)^, -1)) 来设置结果缓冲区的长度。也许您只是不明白该代码在做什么。如果您在另一个上下文(ReceiveLength 方法)中查看该 same 代码,则更容易理解。它对ReceiveBuf 进行同样的调用,表明当您将-1 传递给ReceiveBuf 时,它会返回它接收到的字节数。
为了满足您的目的,您不能发送固定大小的数据包。如果您总是发送 32KB 的数据包,并且只是用零填充结尾,那么ReceiveLength 将始终返回 32768,并且您必须结合 Davita 和我的发送文件和数据包长度的解决方案以及有效负载。但是如果你确保你的数据包中的每个字节总是有效的,那么接收者就可以根据数据包的大小知道要节省多少。
无论如何,您需要确保发件人向收件人提供完成工作所需的信息。如果发件人发送垃圾邮件而没有给收件人提供区分垃圾数据和有效数据的方法,那么你就卡住了。
【讨论】:
好吧,您总是可以在开始文件传输之前发送文件大小,这样您就会知道何时停止写入文件。
【讨论】: