Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 13.03.2017
Сообщений: 5

TcpClient как определить сервер

20.02.2019, 12:11. Показов 1937. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
TcpClient client = new TcpClient(ServerIP,12346);
Пытаюсь создать клиент-серверное приложение для обмена данных между компами.
Для передачи информации к серверу нужно указать его IP, можно как-нибудь определить IP сервера, учитывая, что сервером может быть любой другой компьютер в сети
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.02.2019, 12:11
Ответы с готовыми решениями:

Определить конец потока TcpClient
Использую GetStream(), и выкачиваю данные оттуда. Проблема в том, что если не определить конец потока, то после завершения считывания...

TcpClient. Как понять на сервере что клиент отключился?
как понять на сервере что клиент отключился?

Клиент - сервер. Где использовать Using для TcpClient?
Вот мы запускаем Server new Server(80); internal class Server { private readonly TcpListener Listener; ...

10
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
20.02.2019, 12:48
Цитата Сообщение от SteinG Посмотреть сообщение
можно как-нибудь определить IP сервера, учитывая, что сервером может быть любой другой компьютер в сети
Т.е. Вам фактически нужен список IP всех компов в сети?
0
0 / 0 / 0
Регистрация: 13.03.2017
Сообщений: 5
20.02.2019, 13:12  [ТС]
Нет, список IP активных компьютеров в сети я получить могу, но я не могу определить какой из них выступает в качестве сервера
0
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
20.02.2019, 13:41
Цитата Сообщение от SteinG Посмотреть сообщение
я не могу определить какой из них выступает в качестве сервера
Пробуйте подключиться. Если подключается, значит есть сервер.
Можно вот такой простенький тестер юзать:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        
        public bool Test(string ip, int port)
        {
            try
            {
                using (var client = new TcpClient(ip, port))
                    return true;
            }
            catch
            {
                return false;
            }
        }
0
 Аватар для Soundpro
89 / 86 / 39
Регистрация: 19.10.2012
Сообщений: 243
20.02.2019, 13:41
А клиент всегда на одной машине?
0
0 / 0 / 0
Регистрация: 13.03.2017
Сообщений: 5
20.02.2019, 14:47  [ТС]
Цитата Сообщение от asn31337 Посмотреть сообщение
Пробуйте подключиться. Если подключается, значит есть сервер.
Можно вот такой простенький тестер юзать:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        
        public bool Test(string ip, int port)
        {
            try
            {
                using (var client = new TcpClient(ip, port))
                    return true;
            }
            catch
            {
                return false;
            }
        }
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
TcpClient client;
NetworkStream NS;
 
private void timer1_Tick(object sender, EventArgs e)
        {
            //Если компьютер находится в сети
            if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) return;
            
            var host = Dns.GetHostEntry(Dns.GetHostName());
            //Перебор IP в сети
            foreach (var ip in host.AddressList)
                //Если IP == IPv4
                if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {
                    //Попытка соединения с сервером
                    if (checkServer(ip.ToString()))
                    {
                        client = new TcpClient(ip.ToString(), 12346);
                        NS = client.GetStream();
                        NS.Write(bytes, 0, bytes.Length);
 
                        NS.Close();
                        client.Close();
                    }
                }
        }
Сделал в таймере, т.к. программа должна быть заранее запущена в фоновом режиме и каждые N секунд проверить соединение с сервером, если нашёл, то отправить информацию.
Возникла следующая проблема: ничего не происходит. Программа только подвисает, т.к. обновляет информацию об IPшниках и всё.
Сервер по сути запускается после запуска клиента, жму на кнопку для "принятия" информации, но т.к. ничего не поступает он просто виснет
P.S. checkServer - это функция для проверки соединения, что вы написали выше

Добавлено через 1 минуту
Цитата Сообщение от Soundpro Посмотреть сообщение
А клиент всегда на одной машине?
Клиент может быть запущен на разных машинах или быть не запущен вовсе
0
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
20.02.2019, 15:03
Цитата Сообщение от SteinG Посмотреть сообщение
Сервер по сути запускается после запуска клиента
Может имеет смысл все таки сначала сервер запускать, а потом клиента?

Цитата Сообщение от SteinG Посмотреть сообщение
но т.к. ничего не поступает он просто виснет
скиньте полностью код клиента и сервера
0
0 / 0 / 0
Регистрация: 13.03.2017
Сообщений: 5
20.02.2019, 15:24  [ТС]
Да, ошибся, сервер запускается всё же до клиента

Сервер:
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
TcpListener server;
Byte[] bytes = new Byte[256];
String data = null;
 
private void btnLogin_Click(object sender, EventArgs e)
        {
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            server = new TcpListener(ip, 12346);
            server.Start();
            tmrTCP.Enabled = true;
        }
 
private void tmrTCP_Tick(object sender, EventArgs e)
        {
            try
            {
                TcpClient client = server.AcceptTcpClient();
                NetworkStream NS = client.GetStream();
                int n;
 
                while ((n = NS.Read(bytes, 0, bytes.Length)) != 0)
                {
                    data = System.Text.Encoding.UTF8.GetString(bytes, 0, n);
                    rtbInfo.AppendText(data);
                }
                NS.Close();
                client.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                server.Stop();
                tmrTCP.Enabled = false;
            }
        }
Клиент:
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
TcpClient client;
NetworkStream NS;
Byte[] bytes;
 
        public Form1()
        {
            InitializeComponent();
            this.WindowState = FormWindowState.Minimized;
 
            string message = getNetInterfacesInfo();
            bytes = System.Text.Encoding.UTF8.GetBytes(message);
        }
 
        private bool checkServer(string ip)
        {
            try
            {
                using (var client = new TcpClient(ip, 12346))
                    return true;
            }
            catch
            {
                return false;
            }
        }
 
        private string getNetInterfacesInfo()
        {
            string info = "";
 
            IPGlobalProperties computerProperties = IPGlobalProperties.GetIPGlobalProperties();
            NetworkInterface[] NI = NetworkInterface.GetAllNetworkInterfaces();
 
            info += "Имя компьютера: " + Environment.MachineName;
            info += "\nДомен: " + Environment.UserDomainName;
            info += "\nПользователь: " + Environment.UserName;
 
            info += "\n\nИнформация по сетевым интерфейсам компьютера:";
            info += "\n=============================================\n";
 
            return info;
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            //Если компьютер находится в сети
            if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) return;
            
            var host = Dns.GetHostEntry(Dns.GetHostName());
            //Перебор IP в сети
            foreach (var ip in host.AddressList)
                //Если IP == IPv4
                if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {
                    if (checkServer(ip.ToString()))
                    {
                        client = new TcpClient(ip.ToString(), 12346);
                        NS = client.GetStream();
                        NS.Write(bytes, 0, bytes.Length);
 
                        NS.Close();
                        client.Close();
                    }
                }
        }
0
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
20.02.2019, 15:37
SteinG, такое решение вряд ли будет работать... Вы принимаете подключение от клиента по таймеру. Очевидно, принимать нужно тогда, когда клиент подаст запрос на подключение, а не когда серверу это вздумается. отсюда ничего и не происходит. просто потому что клиент не может достучаться до сервера.

Добавлено через 2 минуты
В сервере таймер вообще не нужен! По крайней мере, для этих целей. Ожидать подключение нужно или в бесконечном цикле, или с использованием асинхронных операций.
0
0 / 0 / 0
Регистрация: 13.03.2017
Сообщений: 5
20.02.2019, 16:43  [ТС]
Но в этом и дело, что нужно получить информацию с тех компьютеров, на которых стоит эта (клиентская) программа.
Таймеры стоят на клиентах, т.к. они не должны быть видны или мешать пользователю (скрыты в трее) и каждые N (допустим 10) секунд отправлять информацию на сервер (если тот включён), но после получения информации с доступных таким образом клиентов, прекращает приём информации до следующей готовности.
И на сколько сильно скажется на производительности, используя бесконечный цикл на сервере, т.к. достаточно получить информацию с клиентов и на этом работа сервера прекращается (частично), но программа продолжает работать для других функций.

И здесь какой IP указывать, где будет размещён сервер или какой IP будет "прослушиваться" (принимать информацию с него)?
C#
1
2
IPAddress ip = IPAddress.Parse("127.0.0.1");
server = new TcpListener(ip, 12346);
P.S. если тестить это всё на одном компьютере и в качестве IP указать localhost, то всё норм
0
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
20.02.2019, 18:16
Цитата Сообщение от SteinG Посмотреть сообщение
Таймеры стоят на клиентах
Так на клиентах то они пусть себе стоят, а сервер то тут при чем? Сервер должен уметь принимать подключение клиента в любое время, а не по расписанию.

Цитата Сообщение от SteinG Посмотреть сообщение
И на сколько сильно скажется на производительности, используя бесконечный цикл на сервере
Лучше, конечно, использовать не бесконечный цикл, а асинхронные методы. Тогда нагрузка на CPU будет минимальной.

Цитата Сообщение от SteinG Посмотреть сообщение
И здесь какой IP указывать
Адрес машины, на которой установлен сервер.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.02.2019, 18:16
Помогаю со студенческими работами здесь

[Socket,TcpClient] Подключение через Sock5 сервер
Доброго времени суток уважаемые форумчане. Вот задачка, помогите разобрать ситуацию : 1)Есть remote сервер1 : Адрес, порт ...

Как соединиться через tcpClient?
Код: static void ListenServer() { string listenIP = Console.ReadLine(); int listenPort =...

Как прочитать ответ из TcpClient?
Кто нибудь работал с TcpClient? Как можно вычитать данные после установки соединения и создания для него потока? В общем есть такое: ...

TcpServer и TcpClient, как переслать сообщение
Как работать с TcpServer и TcpClient в C++Builder 2010? Например, как переслать сообщение от клиента к серверу и обратно?

Как получить ответ от сервера (tcpclient)?
сервер слушает порт radist04ka@ sockstat | grep Temp radist Temp0 2909 3 tcp4 *:9666 *:* и отвечает...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru