【问题标题】:BeginReceive trailing Null character/chr(0)开始接收尾随空字符/字符(0)
【发布时间】:2012-09-12 10:40:24
【问题描述】:

我正在编写一个用于传输文件的异步套接字客户端 (following this Microsoft article),并注意到使用 BeginReceive 会破坏传输,因为它会在每个数据包的末尾添加一个 Null 字符/chr(0)。什么可能导致此问题?我以为它可能是发送方,但我用 SendFile 测试它并得到相同的结果。

在 Microsoft 文章中,它将字节转换为 ASCII 字符串并将其附加到 StringBuilder。我想即时保存字节,所以我几乎没有像这样修改 ReceiveCallback:

Private Shared Sub ReceiveCallback(ByVal ar As IAsyncResult)
    Dim state As StateObject = CType(ar.AsyncState, StateObject)
    Dim client As Socket = state.workSocket
    Dim bytesRead As Integer = client.EndReceive(ar)
    If bytesRead > 0 Then
        FileIO.FileSystem.WriteAllBytes(Application.StartupPath & "\test.exe", state.buffer, True)
        client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReceiveCallback), state)
    Else
        receiveDone.Set()
    End If
End Sub

【问题讨论】:

    标签: vb.net sockets null beginreceive


    【解决方案1】:

    问题在于对ReceiveBeginReceiveEndReceive 工作方式的误解。

    当您调用Receive 并为其指定缓冲区和大小时,您指定了要接收的最大 数据量。 bytesRead 告诉您实际收到了多少。您只需将该数量的字节写入输出文件,因为只有缓冲区的那部分填充了数据。

    更多详情请看这里:

    http://msdn.microsoft.com/en-us/library/w3xtz6a5

    【讨论】:

    • 太棒了,非常感谢。我可以通过使用 FileStream 指定要写入的字节数来解决此问题,其中 bytesRead 为最大长度。
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    相关资源
    最近更新 更多