1

だから私はここでスタックオーバーフローで見つけましたソケットを介してバイナリファイル、画像を送信するための1つのコード..だから私は自分のプロジェクトへのテストにそれを使用しました

private void send_ss()
    {
        byte[] data = new byte[1024];
        int sent;
        IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 306);

        Socket server = new Socket(AddressFamily.InterNetwork,
                        SocketType.Stream, ProtocolType.Tcp);

        try
        {
            server.Connect(ipep);
        }
        catch (SocketException e)
        {
            //Console.WriteLine("Unable to connect to server.");
            //Console.WriteLine(e.ToString());
            //Console.ReadLine();
        }


        Bitmap bmp = new Bitmap("C:\\Windows\\Web\\Wallpaper\\Theme2\\img7.jpg");

        MemoryStream ms = new MemoryStream();
        // Save to memory using the Jpeg format
        bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

        // read to end
        byte[] bmpBytes = ms.ToArray();
        bmp.Dispose();
        ms.Close();

        sent = SendVarData(server, bmpBytes);

        //Console.WriteLine("Disconnecting from server...");
        server.Shutdown(SocketShutdown.Both);
        server.Close();
    }
    private static int SendVarData(Socket s, byte[] data)
    {
        int total = 0;
        int size = data.Length;
        int dataleft = size;
        int sent;

        byte[] datasize = new byte[4];
        datasize = BitConverter.GetBytes(size);
        sent = s.Send(datasize);

        while (total < size)
        {
            sent = s.Send(data, total, dataleft, SocketFlags.None);
            total += sent;
            dataleft -= sent;
        }
        return total;
    }

そこで、ポート 306 (m IRC でリッスン) のリッスン ソケットの 1 つでこの写真を送信しようとしました

on *:socklisten:ac_img:{
  var %p = $ticks $+ $time(hhnnss) $+ $ctime
  sockaccept ac_img_ $+ %p
  echo -s [] Image Connection Established On -> ac_img_ $+ %p
}
on *:sockread:ac_img_*:{
  sockread &picture 
  bwrite $qt($mIRCdir $+ $sockname $+ .jpg) -1 -1 &picture 
}

だから私は ac_img_2920385501147471360792067.jpg のようなファイルを取得しています。元のサイズと同じですが、画像が表示されないので、ワードパッドで両方のファイルを開いたところ、少し異なっていました...理由はわかりません...スクリーンショット

なぜ私がこの問題に直面しているのですか?つまり...ソケットからすべてのデータを取得してファイルに保存していますか? おそらく、C# を介して読み取ったファイルが破損している可能性がありますか?

4

1 に答える 1

2

画像を読み取って解析し、再エンコードするため、画像は異なりますBitmap。ワードパッドのスクリーンショットは、どちらも JPEG ですが、メタデータが異なることを示しています (たとえば、"adobe" missing")。

または他のロスレスメソッドを使用File.ReadAllBytesして画像を読み取るだけです。

送信コードは健全に見えます。ループしている理由がわかりません。送信は、ブロッキングソケットで部分的な IO を行うことはありません。

于 2013-02-13T22:52:04.860 に答える