Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#套接字发送不完整的图像_C#_Sockets - Fatal编程技术网

使用C#套接字发送不完整的图像

使用C#套接字发送不完整的图像,c#,sockets,C#,Sockets,当我尝试使用C#套接字发送图像时,我总是将其视为不完整。我接收到的数据并没有一个确定的大小,比如说我试图发送一个50KB的数据,我可能会收到30,38,25,20等等。。。完全随机的。这是我的代码,如果你能帮我解决这个问题,我会很高兴的。多谢各位 客户端: Socket soketDinleme; byte[] gelenByte = new byte[999999999]; private void frmAnaform_Load(object sender, EventArgs e)

当我尝试使用C#套接字发送图像时,我总是将其视为不完整。我接收到的数据并没有一个确定的大小,比如说我试图发送一个50KB的数据,我可能会收到30,38,25,20等等。。。完全随机的。这是我的代码,如果你能帮我解决这个问题,我会很高兴的。多谢各位

客户端:

Socket soketDinleme;
byte[] gelenByte = new byte[999999999];
private void frmAnaform_Load(object sender, EventArgs e)
    {
        soketDinleme = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        soketDinleme.Bind(new IPEndPoint(IPAddress.Any, 4800));
        soketDinleme.Listen(1);
        soketDinleme.BeginAccept(new AsyncCallback(KabulEdilme), null);
    }

    void KabulEdilme(IAsyncResult iar)
    {
        Socket soket = soketDinleme.EndAccept(iar);
        soket.BeginReceive(gelenByte, 0, gelenByte.Length, SocketFlags.None, new AsyncCallback(VeriGeldiginde), soket);
        soketDinleme.BeginAccept(new AsyncCallback(KabulEdilme), null);
    }

    void VeriGeldiginde(IAsyncResult iar)
    {
        Socket soket = (Socket)iar.AsyncState;
        int uzunluk = soket.EndReceive(iar);
        byte[] veri = new byte[uzunluk];
        Array.Copy(gelenByte, veri, veri.Length);
        string kontrol = Encoding.UTF8.GetString(veri);
        if (kontrol.Contains("kaydol"))
        {
            ServerIslemler.Kaydol.ResimKaydet(veri);
        }
        else
        {
            MemoryStream ms = new MemoryStream(veri);
            Image profilResmi = Bitmap.FromStream(ms);
            profilResmi.Save("C:/denemeResim.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
            ms.Close();
        }
    }
服务器端:

        public static void KayıtVerisiGonder(string gonderilcek, string resimYolu)
        {
            //byte[] metin = Encoding.UTF8.GetBytes("kaydol/" + gonderilcek + IP() + "|");
            Bitmap bmp = new Bitmap(resimYolu);
            MemoryStream ms = new MemoryStream();
            bmp.Save(ms, ImageFormat.Jpeg);
            byte[] resim = ms.ToArray();
            bmp.Dispose();
            ms.Close();
            Socket soket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            soket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4800));
            soket.Send(resim, 0, resim.Length, SocketFlags.None);
            soket.Close();
        }

修正了你的代码格式。。。请注意我为使其更具可读性所做的更改。TCP是一种流协议。当发送N字节时,不能保证您将一次收到N字节。例如,它可以是2个具有N/2字节的接收?