Разрешить доменное имя (URI) при прослушивании сокета tcp в C # - PullRequest
0 голосов
/ 28 июня 2019

Я хочу внедрить консольное приложение с одним сокетом на моем сервере, которое получает данные от нескольких клиентов сокетов.

С другой стороны, у каждого клиента есть свое доменное имя (без использования IP-адреса). Я запускаю прослушиватель на моем сервере со статическим IP-адресом, и я определил запись DNS с подстановочным знаком для IP-адреса (например: * .xxx.yyy.com).

Когда я пингую доменные имена, статический IP-адрес разрешается, и клиенты могут отправлять данные, используя доменные имена.

Я тестирую простое консольное приложение TCP-приемника на конкретном порту, чтобы получить данные, которые отправляет мой консольный клиент.

Вот пример кода слушателя:

using System;
using System.Net;
using System.Text;
using System.Net.Sockets;

namespace SocketExample
{
    public class SocketListener
    {
        public static int Main(String[] args)
        {
            StartServer();
            return 0;
        }


        public static void StartServer()
        {
            var ipAddress = IPAddress.Parse("xxx.xxx.xxx.xxx");
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

            try
            {   
                Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                listener.Bind(localEndPoint);
                listener.Listen(10);
                Socket handler = listener.Accept();

                string data = null;
                byte[] bytes = null;

                while (true)
                {
                    bytes = new byte[1024];
                    int bytesRec = handler.Receive(bytes);
                    data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
                    if (data.IndexOf("<EOF>") > -1)
                    {
                        break;
                    }
                }

                Console.WriteLine("Text received : {0}", data);

                byte[] msg = Encoding.ASCII.GetBytes(data);
                handler.Send(msg);
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

            Console.WriteLine("\n Press any key to continue...");
            Console.ReadKey();
        }
    }
}

И код клиента:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace Client
{
    public class SocketClient
    {
        public static void Main(String[] args)
        {
            byte[] bytes = new byte[1024];


            var ipAddress = IPAddress.Parse("xxx.xxx.xxx.xxx");
            IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);

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


            sender.Connect(remoteEP);

            Console.WriteLine("Socket connected to {0}", sender.RemoteEndPoint.ToString());

            byte[] msg = Encoding.ASCII.GetBytes("This is a test<EOF>");

            int bytesSent = sender.Send(msg);

            int bytesRec = sender.Receive(bytes);
            Console.WriteLine("Echoed test = {0}", Encoding.ASCII.GetString(bytes, 0, bytesRec));

            sender.Shutdown(SocketShutdown.Both);
            sender.Close();
        }
    }
}

Все отлично работает и с DNSEntry, но проблема в том, что я хочу идентифицировать своих клиентов по имени домена, который они вызывают.

Например, у меня есть 2 клиента:

  • client1.xxx.yyy.com
  • client2.xxx.yyy.com

Когда слушатель получает данные, я хочу идентифицировать клиента на основе имени вызывающего домена.

Я хочу знать, как я могу разрешить имена вызывающих доменов на стороне слушателя. Можно ли получить доменное имя или клиенты должны отправить конкретные доменные имена внутри отправленных данных?

1 Ответ

1 голос
/ 28 июня 2019

Если вам нужно текстовое доменное имя, которое клиент использовал для подключения, тогда ваш клиент должен будет отправить его на сервер как часть своего протокола данных, подобно тому, как в HTTP

есть заголовок Host:.

Когда установлено сокетное соединение, это делается только с использованием IP-адресов.Текстовое доменное имя больше не существует.

...