0

Win7 x64 上の Visual Studio 2012 Ult の .NET 4.5 で C# を使用します。

System.Net.Sockets.Socket.SendFile(string filename)メソッドを介してサーバーにファイルを送信させ、クライアントにそれを受信させようとしています。クライアントは、受信したバイトを作成したファイルの末尾に追加して、送信したファイルをクライアント側で再構築します。これはすべて機能します - 少なくとも基本的なテキスト ファイルの場合。

*.exe ファイルを送信しようとすると、受信した *.exe が機能しません。ソース *.exe とクライアント側のコピーの両方を Notepad++ で開くと、一部の奇妙な文字が正しくないことを除けば、ファイルは正しいように見えます。私の質問は、どうすればこれを修正できますか?

サーバーコードは実際にはSocket.SendFile(string filename)、他の関連オプションを使用せずにファイルを送信しているだけなので、クライアントが問題であると想定しています。

クライアント側:

private void ListenAndReport(Socket socket)
{
    EndPoint remoteEndPoint = socket.RemoteEndPoint;
    ReceiveObject obj = new ReceiveObject(socket);
    socket.BeginReceive(obj.buffer, 0, packetSize, SocketFlags.None, new AsyncCallback(ReceiveFromListen), obj);
}
private void ReceiveFromListen(IAsyncResult ar)
{
    ReceiveObject obj = (ReceiveObject)ar.AsyncState;  //ReceiveObject just holds a byte[packetSize] buffer and a Socket

    string received = Encoding.UTF8.GetString(obj.buffer);
    WriteToFile(received);

    obj.socket.EndReceive(ar); //!!! necessary?  Doesn't seem to make a difference.
    ListenAndReport(obj.socket);
}
private void WriteToFile(string text)
{
    fileStream.Write(text);
    fileStream.Flush();
}

のエンコーディングstring received = Encoding.UTF8.GetString(obj.buffer);が間違っていると思いますが、すべての Encoding.something オプションを試しましたが、どれもファイルを正しく送信していません。

または、ファイル ライター にSystem.IO.TextWriter fileStream = File.AppendText(string filename);問題があるのでしょうか。

4

1 に答える 1

5

これが問題です:

string received = Encoding.UTF8.GetString(obj.buffer);

なぜあなたはこれをやっている?テキストではありません。文字列ではなく、バイト配列をファイルに書き込む必要があります。

さらに、の戻り値を使用して、EndReceive読み取ったデータの量を知る必要があります。

int bytesRead = obj.socket.EndReceive(ar);
fileStream.Write(obj.buffer, 0, bytesRead);

(ではなく、実際のストリームfileStreamである必要があります。)TextWriter

これはテキスト ファイルでも機能します。テキストをバイナリとして扱うと、反対側でも同じコンテンツになり、テキストとして読み取ることができます。バイナリデータをテキストとして扱うと、データがめちゃくちゃになってしまいます...

于 2013-02-01T20:17:38.510 に答える