0

我正在编写一个异步套接字客户端来传输文件(在这篇 Microsoft 文章之后),并注意到使用 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
4

1 回答 1

1

问题是对Receive, or BeginReceive&EndReceive工作方式的误解。

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

有关更多详细信息,请参见此处:

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

于 2012-09-12T11:48:26.487 回答