Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# .NET

Войти
Регистрация
Восстановить пароль
 
Vlad0off
3 / 3 / 1
Регистрация: 23.05.2013
Сообщений: 57
#1

Как сделать так чтобы клиент сам находил сервер в локальной сети? - C#

29.10.2017, 03:09. Просмотров 140. Ответов 3
Метки нет (Все метки)

Допустим у нас есть сервер:

Кликните здесь для просмотра всего текста
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
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
 
namespace SocketServer
{
    class Program
    {
        static void Main(string[] args)
        {
            string Host = System.Net.Dns.GetHostName();
            //сдесь просто устанавливаю локальный ip сервера [COLOR="Red"]пускай он будет 192.168.1.20[/COLOR]
            string IP = System.Net.Dns.GetHostByName((string)Host).AddressList[0].ToString();
            // Устанавливаем для сокета локальную конечную точку
            //IPHostEntry ipHost = Dns.GetHostEntry("localhost");
            IPAddress ipAddr = IPAddress.Parse(IP);
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);
 
            // Создаем сокет Tcp/Ip
            Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
 
            // Назначаем сокет локальной конечной точке и слушаем входящие сокеты
            try
            {
                sListener.Bind(ipEndPoint);
                sListener.Listen(10);
 
                // Начинаем слушать соединения
                while (true)
                {
                    Console.WriteLine("Ожидаем соединение через порт {0}", ipEndPoint);
 
                    // Программа приостанавливается, ожидая входящее соединение
                    Socket handler = sListener.Accept();
                    string data = null;
 
                    // Мы дождались клиента, пытающегося с нами соединиться
 
                    byte[] bytes = new byte[1024];
                    int bytesRec = handler.Receive(bytes);
 
                    data += Encoding.UTF8.GetString(bytes, 0, bytesRec);
 
                    // Показываем данные на консоли
                    Console.Write("Полученный текст: " + data + "\n\n");
 
                    // Отправляем ответ клиенту\
                    string reply = "Спасибо за запрос в " + data.Length.ToString()
                            + " символов";
                    byte[] msg = Encoding.UTF8.GetBytes(reply);
                    handler.Send(msg);
 
                    if (data.IndexOf("<TheEnd>") > -1)
                    {
                        Console.WriteLine("Сервер завершил соединение с клиентом.");
                        break;
                    }
 
                    handler.Shutdown(SocketShutdown.Both);
                    handler.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                Console.ReadLine();
            }
        }
    }
}


И такой клиент:
Кликните здесь для просмотра всего текста

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
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
 
namespace SocketClient
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                SendMessageFromSocket(11000);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                Console.ReadLine();
            }
        }
 
        static void SendMessageFromSocket(int port)
        {
            // Буфер для входящих данных
            byte[] bytes = new byte[1024];
 
            // Соединяемся с удаленным устройством
            
            // Устанавливаем удаленную точку для сокета
            IPHostEntry ipHost = Dns.GetHostEntry("[CSHARP]192.168.1.20
");
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, port);

Socket sender = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

// Соединяем сокет с удаленной точкой
sender.Connect(ipEndPoint);

Console.Write("Введите сообщение: ");
string message = Console.ReadLine();

Console.WriteLine("Сокет соединяется с {0} ", sender.RemoteEndPoint.ToString());
byte[] msg = Encoding.UTF8.GetBytes(message);

// Отправляем данные через сокет
int bytesSent = sender.Send(msg);

// Получаем ответ от сервера
int bytesRec = sender.Receive(bytes);

Console.WriteLine("\nОтвет от сервера: {0}\n\n", Encoding.UTF8.GetString(bytes, 0, bytesRec));

// Используем рекурсию для неоднократного вызова SendMessageFromSocket()
if (message.IndexOf("<TheEnd>") == -1)
SendMessageFromSocket(port);

// Освобождаем сокет
sender.Shutdown(SocketShutdown.Both);
sender.Close();
}
}
}[/CSHARP]


Как известно, чтобы клиент передал серверу какие-то данные ему(клиенту) необходимо знать ip сервера. Есть ли способ сделать так чтобы клиент узнал ip адрес сервера сам, т.е клиент не заморачивался об ip сервера и не вбивал его вручную каждый раз?



Я думал так:
1) Клиент посылает уникальное сообщение по широковещательному адресу сети, своего рода предложение серверу для подключения (Например такую строку: "Привет сервер скинь мне свой IP"), которое может распознать только сервер.
2) Эти пакеты распространяются по всем компьютерам в локальной сети независимо есть на них сервер или нет.
3) Так как у этих пакетов есть флаг и где-то в сети есть компьютер, на котором стоит сервер. Сервер распознает сообщение и отвечает по широковещательному адресу уникальным сообщением клиенту, в котором содержится его ip адрес (Например: Привет вот мой ip: 192.168.1.20).
4) Клиент распознает сообщение и подключается на прямую к серверу через полученный ip адрес.

И тут возникают, как минимум, такие вопросы по реализации:
1) Можно ли вообще слать пакеты по широковещательному адресу?
2) Как слать сообщения по широковещательному адресу с помощью стандартных методов (которые содержатся в соответственных стандартных библиотеках) C#?
3) Как узнать этот широковещательный адрес (надеюсь есть какие-нибудь стандартные методы в C#)?

Чуть не забыл, протокол TCP не обязателен, можно и UDP.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2017, 03:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать так чтобы клиент сам находил сервер в локальной сети? (C#):

Как сделать, что бы установщик сам находил нужную папку - C#
Возник такой вопрос. Как сделать, что бы установщик сам находил нужную папку или как указать путь в установщик нужную нам папку для...

Как сделать так чтобы клиент видел не только свои но и чужие сообщения - C#
В общем такой вопрос, есть чат состоящий из сервера и клиетнта, каждый клиент работает в своем потоке. Так вот при отправке сообщений, свои...

Клиент-сервер: как сделать чтобы задачи отправки и принятия сообщений работали параллельно - C#
Привет, есть один код асинхронного сервера, взял отсюда http://msdn.microsoft.com/ru-ru/library/dd335942.aspx#Section6 вот его код using...

Сделать так, чтобы пакеты не отправлялись с клиента если сервер не желает их принимать - C#
Собственно,имеется сервер,который получает пакеты при определённых условиях и клиенты.Проблема в том,что пакеты с клиента отправляются если...

Как организовать клиент-сервер, а так же передачу и обработку XML - C#
В общем вопрос такой, я не знаю как делать обращение к серверу xml, что-бы я мог отправить и принять его. Какую библиотеку надо подключать...

.NET 4.x Клиент сервер, передача файлов по сети - C#
Здравствуйте. Как можно организовать работу приложения чтобы клиент получал от сервера хранящиеся на нем файлы,т.е. выполнить команду,а...

3
freeba
Неадекват
1190 / 982 / 110
Регистрация: 02.04.2010
Сообщений: 2,272
Записей в блоге: 2
Завершенные тесты: 2
29.10.2017, 04:27 #2
Задача в общем то тривиальная. Гляньте в msdn.
1
insite2012
Модератор
Эксперт .NET
4619 / 3571 / 870
Регистрация: 12.10.2013
Сообщений: 10,536
Записей в блоге: 2
29.10.2017, 10:02 #3
Цитата Сообщение от Vlad0off Посмотреть сообщение
Есть ли способ сделать так чтобы клиент узнал ip адрес сервера сам, т.е клиент не заморачивался об ip сервера и не вбивал его вручную каждый раз?
Это уже все есть. Используйте WCF Discovery/WCF Announcement
1
Vlad0off
3 / 3 / 1
Регистрация: 23.05.2013
Сообщений: 57
29.10.2017, 13:35  [ТС] #4
Спасибо, попробуем.
0
29.10.2017, 13:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2017, 13:35
Привет! Вот еще темы с ответами:

Клиент сервер для глобальной сети на С# - C#
Дело такое, нужно сделать сервер, который будет висеть на каком-нибуть хостинге, а клиент будет запускаться на ПК. При получении сообщения...

Как сделать так, чтобы по ссылке класса А оказался класс Б - C#
Добрый день! Есть Dictionary, содержащий экземпляры класса &quot;Книга&quot;. Есть другие классы, ссылающиеся на эти экземпляры, допустим на А....

Клиент-сервер: Как определить, что клиент отключился? - C#
Привет. Есть клиент и сервер, при подключении клиента, на сервере создается класс, который содержит копию сокета и всякую инфу клиента, и...

Клиент-серверное приложение: как определить, что сервер/клиент не отвечает в течении определенного времени - C#
Пишу клиент-серверное приложение. Использую TCPListener и TCPClient. Вопрос: как определить что сервер(клиент) не отвечает в течении...


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

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

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