Search code examples
c#socketsjpegmirc

C# Socket Send Picture JPEG


So I have found here in stackoverflow One code for sending through sockets a binary file, an image.. So i used it for test to my Project

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;
    }

so i tried to send this picture on one of my Listening Sockets in Port 306 (listened with m IRC)

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 
}

So i'm getting files like ac_img_2920385501147471360792067.jpg and so on. Same size with the original BUT the images just not appearing , so i opened Both files with word pad and they were a bit different... dunno why...ScreenShot

So any ideas why i'm facing this issue? i mean... I'm taking every single data from my socket and saving them to the file? Maybe a corrupt on file read through c#?


Solution

  • The image is different because you read it, parse it into a Bitmap and reencode it. The wordpad screenshot shows that both are JPEG's but with different metadata (for example "adobe" missing").

    Just use File.ReadAllBytes or other lossless methods to read the image.

    The sending code looks sound. Not sure why you're looping. Sending never does partial IOs AFAIK on blocking sockets.