【问题标题】:File Transfer using winsock使用winsock进行文件传输
【发布时间】:2010-12-02 13:54:33
【问题描述】:

我想通过winsock发送文件(文本或二进制),我有一个32768字节大小的缓冲区,另一边的缓冲区大小相同,但是当数据包大小

【问题讨论】:

    标签: delphi winsock


    【解决方案1】:

    对于固定大小的“数据包”,我们通常会认为除了最后一个数据包之外的每个数据包都将完全充满有效数据。只有最后一个是“部分的”,并且如果收件人知道需要多少字节(因为使用 Davita 的建议,发件人提前告诉了它文件大小),那没问题。接收者可以简单地忽略最后一个数据包的剩余部分。

    但是您的进一步描述听起来好像有多个与单个文件传输相关联的部分完整数据包。有一个类似的简单解决方案:在每个数据包前加上有效字节数。

    你稍后提到TCustomWinSocket.ReceiveText,你想知道它是如何知道要读取多少文本的,然后你引用答案,即它在填充之前调用ReceiveBuf(Pointer(nul)^, -1)) 来设置结果缓冲区的长度。也许您只是不明白该代码在做什么。如果您在另一个上下文(ReceiveLength 方法)中查看该 same 代码,则更容易理解。它对ReceiveBuf 进行同样的调用,表明当您将-1 传递给ReceiveBuf 时,它会返回它接收到的字节数。

    为了满足您的目的,您不能发送固定大小的数据包。如果您总是发送 32KB 的数据包,并且只是用零填充结尾,那么ReceiveLength 将始终返回 32768,并且您必须结合 Davita 和我的发送文件和数据包长度的解决方案以及有效负载。但是如果你确保你的数据包中的每个字节总是有效的,那么接收者就可以根据数据包的大小知道要节省多少。

    无论如何,您需要确保发件人向收件人提供完成工作所需的信息。如果发件人发送垃圾邮件而没有给收件人提供区分垃圾数据和有效数据的方法,那么你就卡住了。

    【讨论】:

      【解决方案2】:

      好吧,您总是可以在开始文件传输之前发送文件大小,这样您就会知道何时停止写入文件。

      【讨论】:

      • 我会试试的,我正在寻找一种解决方案来确定它在另一端而不改变发件人端
      • 哦挂断,发送前无法确定数据包大小,SendBuff方法在发送数据包后返回amuntsent,我也尝试在另一端cpauter数据包并等待数据包大小即将到来,但它会太复杂,似乎不可能
      • Socket.ReciveText 确定数据包大小和实际数据,但我不知道如何 => function TCustomWinSocket.ReceiveText: string;开始 SetLength(Result, ReceiveBuf(Pointer(nil)^, -1)); SetLength(Result, ReceiveBuf(Pointer(Result)^, Length(Result)));结束;
      • 您不知道数据包的大小,但您知道文件的大小,对吗?在发送文件之前,发送文件大小。客户端将知道它应该写入文件的字节数。当客户端接收到数据包时,将其存储在内存中,获取它的长度,如果已经接收到的数据包大小+当前数据包大小>文件大小,则写入文件大小-已接收数据包大小。希望你明白:)
      • 我明白,我有文件大小,但请看:缓冲区看起来像这样
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      相关资源
      最近更新 更多