在 C# 中侦听 tcp 套接字时解析域名 (URI)
Resolve domain name (URI) when listening to tcp socket in C#
我想在我的服务器上实现一个单一的套接字侦听器控制台应用程序,它从多个套接字客户端获取数据。
另一方面,每个客户端都有自己的域名(不使用IP地址)。我是 运行 我服务器上的侦听器,具有静态 IP 地址,并且我已经为 IP 地址定义了一个通配符 DNS 记录(例如:*.xxx.yyy.com)。
当我ping域名时,静态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个客户:
- 客户端1.xxx.yyy.com
- 客户端2.xxx.yyy.com
当监听器收到一个数据时,我想根据调用域名来识别客户端。
我想知道如何在监听端解析调用域名。
是否可以获取域名或客户端应该在发送的数据中发送特定的域名?
如果您想要客户端用于连接的文本域名,那么您的客户端必须将其作为其数据协议的一部分发送到服务器,类似于 Host:
[= HTTP 中的 15=]
建立套接字连接后,仅使用 IP 地址即可完成。文本域名此时已不存在。
我想在我的服务器上实现一个单一的套接字侦听器控制台应用程序,它从多个套接字客户端获取数据。
另一方面,每个客户端都有自己的域名(不使用IP地址)。我是 运行 我服务器上的侦听器,具有静态 IP 地址,并且我已经为 IP 地址定义了一个通配符 DNS 记录(例如:*.xxx.yyy.com)。
当我ping域名时,静态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个客户:
- 客户端1.xxx.yyy.com
- 客户端2.xxx.yyy.com
当监听器收到一个数据时,我想根据调用域名来识别客户端。
我想知道如何在监听端解析调用域名。 是否可以获取域名或客户端应该在发送的数据中发送特定的域名?
如果您想要客户端用于连接的文本域名,那么您的客户端必须将其作为其数据协议的一部分发送到服务器,类似于 Host:
[= HTTP 中的 15=]
建立套接字连接后,仅使用 IP 地址即可完成。文本域名此时已不存在。