Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Зависает программа


Автор: WERITAS 21.2.2010, 13:48
Добрый день. Пишу программу, которая коннектиться к ip-камер в инете. Столкнулся с неожиданной багой: после 3-4 раз подключения к ip-камере, на 4-5 раз программа зависает на строчке получения ответа от запроса
Код

WebRequest request = WebRequest.Create(url);
WebResponse responce = request.GetResponse(); // <---

а позже вылетает исключение с сообщением  The operation has timed out. После этого любые попытки подключится не удаются. 
Пробовал тестить свой код с обычными сайтами в инете (специально убрал алгоритм разбора принимаемого потока), оказывается, что всё работает. А вот если, скажем, 3-4 раз подконнектится к камере и каждый раз разрывать соединение, то на 4-5 раз просто подключиться уже не получается.

Controller.cs
Код

using System;
using System.Net;
using System.Text;
using System.IO;
using System.Threading;

namespace WindowsFormsApplication1
{
    delegate void DebugHandler(string debugInfo);

    class Controller
    {
        public string url;

        public DebugHandler ResultProcessing;
        public DebugHandler DebugProcessing;

        public Controller()
        {
        }

        public void Start()
        {
            ThreadPool.QueueUserWorkItem(Receive);
        }

        public void Stop()
        {
            Thread.Sleep(1000);
         
        }

        private void Receive(Object ins)
        {
            try
            {
                WebRequest request = WebRequest.Create(url);

                DebugProcessing("Getting responce");
                WebResponse responce = request.GetResponse();                

                Stream stream = responce.GetResponseStream();
                DebugProcessing("SUCCESS");

            }
            catch (Exception exc)
            {
                DebugProcessing(exc.Message);
            }
        }

    }

}


Form1.cs
Код

using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Net;
using System.Threading;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private Controller controller;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            controller = new Controller();
            controller.DebugProcessing = new DebugHandler(DebugShow);
            controller.ResultProcessing = new DebugHandler(ResultShow);

            comboBox1.Items.Add("http://webcam.perm.ru/video.php?resolution=640x480&camera_id=2");
            comboBox1.Items.Add("http://webcam.perm.ru/video.php?resolution=640x480&camera_id=3");
            comboBox1.Items.Add("http://webcam.perm.ru/video.php?resolution=640x480&camera_id=4");
            comboBox1.Items.Add("http://webcam.perm.ru/video.php?resolution=640x480&camera_id=5");
            comboBox1.Items.Add("http://webcam.perm.ru/video.php?resolution=640x480&camera_id=12");
    

            /*
            comboBox1.Items.Add("http://www.yandex.ru");
            comboBox1.Items.Add("http://www.mail.ru");
            comboBox1.Items.Add("http://www.rambler.ru");
            comboBox1.Items.Add("http://www.google.com");
            comboBox1.Items.Add("http://www.yahoo.com");
            //*/
        }

        private void button1_Click(object sender, EventArgs e)
        {
            controller.url = comboBox1.Text;
            controller.Start();

            button1.Enabled = false;   
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox2.Clear();
            textBox3.Clear();

            button1.Enabled = true;
        }


        private void ResultShow(string ResultInfo)
        {
            textBox2.Invoke(new DebugHandler(ResultTrace), ResultInfo);
        }

        private void ResultTrace(object ins)
        {
            string info = ins.ToString();
            textBox2.Text = info;
        }


        private void DebugShow(string debugInfo)
        {
            textBox3.Invoke(new DebugHandler(DebugTrace), debugInfo);
        }

        private void DebugTrace(object ins)
        {
            string info = ins.ToString();
            textBox3.Text = info;
        }



    }
}


Автор: nmn 21.2.2010, 17:15
может камера перестает принимать подключения?
попробуй убрать всю логику и просто поподключаться несколько раз подряд, 10-15

Автор: nmn 21.2.2010, 17:34
там еще как то хитро картинка присылается, идет один запрос и после этого непрерывный поток данных с картинками

Автор: nmn 21.2.2010, 18:22
один раз открыл соединение и можешь читать данные из потока

только вот странная вещь у меня получилась
Код
ач
request = (HttpWebRequest)WebRequest.Create("http://webcam.perm.ru/video.php?resolution=640x480&camera_id=2");
            response = (HttpWebResponse)request.GetResponse();

            Console.WriteLine("headers");
            for (int i = 0; i < response.Headers.Count; i++)
            {
                Console.WriteLine("{0}: {1}", response.Headers.AllKeys[i], response.Headers[i]);
            }
            Console.WriteLine("\n{0}", (int)response.StatusCode);
            //response.Close();


если раскомментировать последнюю строчку, то он начинает получать данные и не останавливается

Автор: WERITAS 21.2.2010, 19:25
Тема более не актуальна, просьба закрыть

Автор: Linus 14.5.2010, 13:39
Просьба поведать, в чем была проблема. Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)