1

わかりました、この問題を抱えている人を複数見てきました。問題の原因をある程度突き止めましたが、修正方法がわかりません。基本的に、ソケット経由でクライアントからサーバーにスクリーンショットを送信しようとしています。クライアント アプリケーションでスクリーンショットを撮り、次のメソッドを使用してバイト配列に変換します。

// Convert bitmap to byte method
public static byte[] ImageToByte(Bitmap bitmap)
{
    byte[] imageData;
    using (var stream = new MemoryStream())
    {
        bitmap.Save(stream, ImageFormat.Png);
        imageData = stream.ToArray();
        return imageData;
    }
}

次に、バイト配列の長さとバイト配列をサーバーに送信します。サーバーは、長さを受け取った後、このメソッドを使用して実際のデータを取得します (ほとんどのデータは関係ないため、これはメソッドの一部です)。

void dataRecieveCallback(IAsyncResult ar)
{
    try
    {
        int rec = sck.EndReceive(ar);

        if (rec <= 0)
        {
            return;
        }

        recieveBuffer.bufStream.Write(recieveBuffer.buffer, 0, rec);
        recieveBuffer.toRecieve -= rec;

        if (recieveBuffer.toRecieve > 0)
        {
            Array.Clear(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length);
            recieveBuffer.bufStream.Position = 0;
            sck.BeginReceive(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length, SocketFlags.None, dataRecieveCallback, null);
            return;
        }

        // Convert all recieved data in memory stream to a byte array
        byte[] finalBuffer = recieveBuffer.bufStream.ToArray();

次に、を使用しfinalBufferて画像を取得しようとしますが、取得するたびに、次の方法を使用します。

        TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap));
        Bitmap screenShot = (Bitmap)tc.ConvertFrom(finalBuffer);

私はいつも「パラメータが無効です」というメッセージSystem.ArgumentExceptionを受け取ります。System.Drawing.ImageFromStreamこのコードは文字列の送信には問題なく機能しましたが、画像を送信しようとすると機能しません。スクリーンショットを撮り、同じ方法を使用してバイト配列に変換し、同じ方法を使用して元に戻すことでローカルでこれを実行しようとしたため、ソケットコードの問題であると確信しています。ここで私のコードの何が問題なのか知っている人はいますか?

これはバッファのコードの一部です

struct RecBuffer 
{ 
   public const int BUFFER_SIZE = 1024;
   public byte[] buffer;
   public int toRecieve;
   public MemoryStream bufStream;

   public RecBuffer(int toRec) 
   {
      buffer = new byte[BUFFER_SIZE];
      toRecieve = toRec;
      bufStream = new MemoryStream(toRecieve);
   }
}

このチュートリアルのかなりのコードを使用しました。少なくとも受け側は。

4

1 に答える 1

1

問題はあなたの機能にあると思いますdataRecieveCallback。そこで、bufStream の位置をゼロにリセットします。

if (recieveBuffer.toRecieve > 0)
{
  Array.Clear(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length);
  recieveBuffer.bufStream.Position = 0; // <--Here
  sck.BeginReceive(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length, SocketFlags.None, dataRecieveCallback, null);
  return;
}

これは、システムが次にコールバック関数を呼び出すときに、既に受信したバイトを上書きすることを意味します。

したがって、行を削除するだけです

recieveBuffer.bufStream.Position = 0;

あなたのコードは正常に動作するはずです。

于 2012-11-10T08:57:22.670 に答える