Я хочу внедрить консольное приложение с одним сокетом на моем сервере, которое получает данные от нескольких клиентов сокетов.
С другой стороны, у каждого клиента есть свое доменное имя (без использования 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
Когда слушатель получает данные, я хочу идентифицировать клиента на основе имени вызывающего домена.
Я хочу знать, как я могу разрешить имена вызывающих доменов на стороне слушателя.
Можно ли получить доменное имя или клиенты должны отправить конкретные доменные имена внутри отправленных данных?