Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
#1

TcpClient

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

Захотелось написать клиента, просто ради интереса.

По идее при 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2011, 13:01
Ответы с готовыми решениями:

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

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

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

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

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

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

Если таймер тикнул, значит сокет за установленное ему время не успел соединиться. Закрываем сокет и вызываем событие что соединение зафейлилось. Заинтересованные объекты это событие обрабатывают и выдают сообщение пользователю/закрывают приложение/форматируют диск/жарят карри.
Зачем здесь выбросы исключений?
1
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
15.11.2011, 15:07  [ТС] #7
kolorotur, Да, согласен. Спасибо!
0
15.11.2011, 15:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2011, 15:07

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

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

Как соединиться через tcpClient?
Код: static void ListenServer() { string...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru