C# Socket Image

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by noxjoker, 10 Sep 2010.

  1. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Существует задача

    Есть Сервер и Клиент. Клиент делает скрин и отправляет скрин на Сервер. Проблема в сервере.

    Сервер
    Переделовает массив байтов imga в Картинку

    Запустил я сервер запустил клиент. Клиент отсылает серверу байты он их преобразовует но бывает такая ситуация когда сервер пишет:


    [​IMG]
    Клиент отсылает 5 - 6 скриншотов и появляется ошибка. :confused:
     
    #1 noxjoker, 10 Sep 2010
    Last edited: 10 Sep 2010
  2. Bers

    Bers Member

    Joined:
    17 May 2010
    Messages:
    78
    Likes Received:
    30
    Reputations:
    26
    Распиши, что находится в Exception. Тип, сообщение, стек и вложенные исключения, если есть.
    По тому, что есть - полагаю, что в буфере приходят некорректные данные, и Image.FromStream() вылетает. Но это мнение ничем не обосновано :)
     
  3. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Bers
    обновил скрин
    Вполне возможно. Но я думаю тут что-то другое. Поскольку если посмотреть разницу между массивом в клиенте и сервере она одинаковая.
     
  4. Bers

    Bers Member

    Joined:
    17 May 2010
    Messages:
    78
    Likes Received:
    30
    Reputations:
    26
    Вообще вылетает именно Image.FromStream(). Сюда по рефлектору - вылетает она из-за того, что stream, который в нее передается, == null. Либо из-за некорректного формата данных.
    Сюда по всему - скорее всего данные в буфере поврежены. Может быть, где-то что-то в буфер пишется не до конца. Либо пишется все, но не все пишется правильно :)
     
  5. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Проблема так и не решена!

    Решилось что проблема в передаче длины массива imga.

    Сервер :
    [​IMG]

    Клиент :
    [​IMG]

    Ошибка на сервере :
    [​IMG]

    Вот исходники :
    http://zalil.ru/29670069
     
    #5 noxjoker, 13 Sep 2010
    Last edited: 14 Sep 2010
  6. CodeSender:)

    CodeSender:) Active Member

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    попробуй юзать в место int, long или double
     
  7. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    ты не понел. Проблема в передаче! Видиш я buff делаю в стринг и там какаэто гадасть.
     
  8. CodeSender:)

    CodeSender:) Active Member

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    Ааа блин, тьфу ты...byte[] buff = new byte[1024]; вынеси за цикл, сделай вот так:
    PHP:
            private void button1_Click(object senderEventArgs e)
            {
                
    TcpListener tcpL = new TcpListener(10);
                
    tcpL.Start();
                
    TcpClient s tcpL.AcceptTcpClient();
                
    byte[] imga;
                
    byte[] buff = new byte[1024];
                for (
    int i 0100i++)
                {
                    
    Application.DoEvents();
                    
    s.Client.Receive(buff);
                    
    int len BitConverter.ToInt32(buff0);
                    
    imga = new byte[len];
                    
    s.Client.Receive(imga);
                    
    this.pictureBox1.Image byteArrayToImage(imga);
                }
            }
    У тебя же переполнение буфера получается ^_^
     
  9. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Тоже самое! Там нет переполнения! Я ж исходники дал. Попробуй сам.
     
  10. CodeSender:)

    CodeSender:) Active Member

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    окей, домой приду гляну.
     
  11. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Проблема так и не решена прошу помощи.

    Сделайте хотяб так.

    Клиент делает скрин отправляет серверу. Сервер принимет отобржает. И так по циклу.
     
  12. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Нужен ответ!
     
  13. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Вот немного лучше написал все равно некоректно работает!

    PHP:
    Скачать http://filesurf.ru/207803
    Server:

    WaitForData();

    Code:
    byte[] m_DataBuffer = new byte[1000000];
            IAsyncResult m_asynResult;
            AsyncCallback pfnCallBack;
            Socket m_socClient;

    Code:
    public void WaitForData()
            {
                byte[] a = new byte[1];
                if (pfnCallBack == null)
                    pfnCallBack = new AsyncCallback(OnDataReceived);
                m_socClient.Send(a);
                m_asynResult = m_socClient.BeginReceive(m_DataBuffer, 0, m_DataBuffer.Length, SocketFlags.None, pfnCallBack, null);
                m_asynResult.AsyncWaitHandle.WaitOne();
                this.pictureBox1.Image = byteArrayToImage(ms.ToArray());
    
            }
            public void OnDataReceived(IAsyncResult asyn)
            {
                int a = m_socClient.EndReceive(asyn);
                ms.Position = 0;
                ms.Write(m_DataBuffer, 0, a);
                //this.listBox1.Items.Add(m_DataBuffer[30000].ToString());
            }
    Client:

    Code:
    while (true)
                {
                    byte[] a = new byte[1];
                    client.Client.Receive(a);
                    byte[] buffer = ImageToByte(CaptureScreenShot());
                    client.Client.Send(buffer);
                }
    :confused:

    20-30 скринов и Error;