Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Vlad0off
3 / 3 / 5
Регистрация: 23.05.2013
Сообщений: 58
1

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

29.10.2017, 03:09. Просмотров 198. Ответов 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
Ответы с готовыми решениями:

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

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

Клиент-сервер: как сделать чтобы задачи отправки и принятия сообщений работали параллельно
Привет, есть один код асинхронного сервера, взял отсюда...

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

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

3
freeba
Неадекват
1261 / 1060 / 202
Регистрация: 02.04.2010
Сообщений: 2,433
Записей в блоге: 2
Завершенные тесты: 2
29.10.2017, 04:27 2
Задача в общем то тривиальная. Гляньте в msdn.
1
insite2012
Модератор
Эксперт .NET
4851 / 3806 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
29.10.2017, 10:02 3
Цитата Сообщение от Vlad0off Посмотреть сообщение
Есть ли способ сделать так чтобы клиент узнал ip адрес сервера сам, т.е клиент не заморачивался об ip сервера и не вбивал его вручную каждый раз?
Это уже все есть. Используйте WCF Discovery/WCF Announcement
1
Vlad0off
3 / 3 / 5
Регистрация: 23.05.2013
Сообщений: 58
29.10.2017, 13:35  [ТС] 4
Спасибо, попробуем.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2017, 13:35

Клиент сервер, передача файлов по сети
Здравствуйте. Как можно организовать работу приложения чтобы клиент получал...

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

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


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

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

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