0

ファイルを転送するための非同期ソケット クライアントをコーディングしています (この Microsoft の記事に従って)。BeginReceive を使用すると、各パケットの最後に 1 つの 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問題は、どのように、またはBeginReceive&が機能するかについての誤解EndReceiveです。

呼び出しReceiveてバッファとサイズを指定すると、受信するデータの最大量を指定することになります。それはbytesReadあなたが実際に受け取った金額を教えてくれるものです。バッファのその部分だけにデータが入力されているため、出力ファイルに書き込む必要があるのはそのバイト数だけです。

詳細については、こちらをご覧ください。

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

于 2012-09-12T11:48:26.487 に答える