Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
1
.NET 4.x

TcpClient

15.11.2011, 13:01. Показов 1956. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Захотелось написать клиента, просто ради интереса.

По идее при OnTimer должен лететь Exception. Но нет. Не летит. В чем мб проблема? Где он съедается? Спасибо.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Net;
using System.Net.Sockets;
using System.Timers;
 
namespace space
{
    class NetworkException : WebException
    {
        public NetworkException(string s):base(s)
        {
        }
    }
    class Client
    {
        public Client(string ip, int port)
        {
            IP = ip;
            Port = port;
        }
        public void Connect()
        {
            timer_ = new Timer(1000);
            timer_.Elapsed += new ElapsedEventHandler(OnTimer);
            timer_.Start();
            DoResolve();
        }
        private void DoResolve()
        {
            Console.WriteLine("Do resolve");
            Dns.BeginGetHostAddresses(IP, new AsyncCallback(OnResolve), null);
        }
        private void DoConnect()
        {
            client_ = new TcpClient();
            client_.BeginConnect(endpoint_.Address, endpoint_.Port, new AsyncCallback(OnConnect), null);
        }
        private void OnResolve(IAsyncResult res)
        {
            Console.Write("On resolve ");
            IPAddress[] addresses = Dns.EndGetHostAddresses(res);
            Console.WriteLine("{0}", res.IsCompleted);
            if (addresses.Count() == 0)
            {
                throw new NetworkException("No addresses resolved");
            }
            endpoint_ = new IPEndPoint(addresses[0], Port);
            DoConnect();
        }
        private void OnConnect(IAsyncResult res)
        {
            Console.WriteLine("On connect ");
            try
            {
                client_.EndConnect(res);
                Console.WriteLine("{0}", res.IsCompleted);
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
                throw new NetworkException("Connect error");
            }
            timer_.Stop();
            Exit = true;
        }
        private void OnTimer(object source, ElapsedEventArgs args)
        {
            Console.WriteLine("On timer");
            timer_.Stop();
            timer_.Close();
            Console.WriteLine("!");
            throw new NetworkException("Timeout error");
        }
        private TcpClient client_;
        private IPEndPoint endpoint_;
        private Timer timer_;
        public string IP
        {
            get; private set;
        }
        public int Port
        {
            get; private set;
        }
        public bool Exit
        {
            get; private set;
        }
    }
    class Test
    {
        static void Main(string[] args)
        {
            Client cl = new Client("yandex.ru", 801);
            try
            {
                cl.Connect();
                while(!cl.Exit)
                {
                  
                }
            }
            catch(NetworkException e)
            {
                Console.WriteLine(e.Message);
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2011, 13:01
Ответы с готовыми решениями:

TcpCLient
Доброго времени товарищи! При создании экземпляра TcpClient метод не принимает аргументов....

TcpClient
Как быть товарищи? Когда всё под одной кнопкой Client существует.

Класс TcpClient
Доброго дня. Объясните, пожалуйста, следующую вещь. При создании TcpClient'a как канал между...

TcpClient и TcpListener
Помогите разобраться. Текст сервера: //Создаем TcpListener IPAddress...

6
Эксперт .NET
17791 / 12942 / 3381
Регистрация: 17.09.2011
Сообщений: 21,219
15.11.2011, 13:39 2
Метод OnTimer выполняется в отдельном потоке. Исключение летит и просто схлопывает поток, так как не ловится.
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.11.2011, 14:00  [ТС] 3
kolorotur, Не могу понять как это поправить. Ведь поток создается независимо от меня => вижу только вариант использовать нечто другое или не кидаться исключениями, но по логике вещей, тут должно быть именно исключение. Впринципе можно устанавливать некий флажок и проверять, но тоже не айс. Какой вариант предложили бы вы?
0
Эксперт .NET
17791 / 12942 / 3381
Регистрация: 17.09.2011
Сообщений: 21,219
15.11.2011, 14:13 4
Вы реализуете асинхронное соединение, следовательно все ошибки при соединении обрабатываются тоже асинхронно.
Пишите код обрабатывания зафейлившего соединения в обработчике таймера или запускайте свое событие типа ConnectFailed, на которое подпишутся заинтересованные объекты.
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.11.2011, 14:53  [ТС] 5
kolorotur, Видимо я чего-то не понимаю. Событие написал. В таймере собственно должны бы его рейзануть получается, в итоге событие рейзится не в главном потоке, переходит в обработчик - эксепшн летит и поток мрет. Что я неверно сделал?
0
Эксперт .NET
17791 / 12942 / 3381
Регистрация: 17.09.2011
Сообщений: 21,219
15.11.2011, 15:06 6
Цитата Сообщение от ForEveR Посмотреть сообщение
Что я неверно сделал?
Выбросили исключение в потоке. Зачем?

Если таймер тикнул, значит сокет за установленное ему время не успел соединиться. Закрываем сокет и вызываем событие что соединение зафейлилось. Заинтересованные объекты это событие обрабатывают и выдают сообщение пользователю/закрывают приложение/форматируют диск/жарят карри.
Зачем здесь выбросы исключений?
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.11.2011, 15:07  [ТС] 7
kolorotur, Да, согласен. Спасибо!
0
15.11.2011, 15:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2011, 15:07
Помогаю со студенческими работами здесь

TcpClient и TcpServer
Доброго времени суток) Сижу, пытаюсь написать tcp сервер, а к нему паралельно клиент... Как...

TcpClient проверка соединения
Вот я допустим соединился с сервером TcpClient newClient = new TcpClient(); ...

Отключение TcpClient от сервера
Добрый вечер! Создаю TcpCLient и коннекчу его к серверу TcpClient TCP = new TcpClient();...

TcpClient для отправки на разные IP
Добрый день не могу найти ответа на вопрос, по этому задам здесь. У меня стоит задача создать класс...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru