是否可以在不保持套接字打开的情况下识别早期的UDP客户端?我想将一个整数ID链接到每个唯一的客户端,但我不想让任何其他线程保持打开状态。
//接收(服务器)
private static Int32 port = 11000;
private static UdpClient udpClient = new UdpClient(port);
public static void receive_threaded()
{
Thread t = new Thread(() =>
{
while (true)
{
IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Any, port);
byte[] content = udpClient.Receive(ref remoteIPEndPoint);
if (content.Length > 0)
{
string message = Encoding.UTF8.GetString(content);
if (action_message_receive != null) action_message_receive(String.Format("Recv({0}): {1}", remoteIPEndPoint.Port, message));
parseMessage(message);
}
}
});
t.Start();
}
//发送(客户端)
private static void send_message(string ip, string message)
{
byte[] packetData = System.Text.UTF8Encoding.UTF8.GetBytes(message);
int port = 11000;
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ip), port);
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
client.SendTo(packetData, ep);
if (action_message_send != null) action_message_send("Send: " + message);
}
客户端可以从服务器请求(临时)用户ID,服务器会将其添加到其数据库中,并在完成此操作后通知客户端。但是,我不能让客户端在发出请求时发送自己的userID,因为任何内存更改应用程序都意味着“黑客”可以访问其他用户的内容。
由于套接字未保持打开状态,每次客户端向服务器发送内容时, IPEndPoint.Port 都会更改,因此我无法跟踪它。我可以通过在userID请求上创建用户名/传递并在其后涉及userID的每个请求上发送这些内容来完成它,但这很愚蠢。
那么有没有办法在不为每个客户端保持线程打开的情况下执行此操作?我可能在这里做了一些非常奇怪的事情,因为UDP应该是一条单行道,但我在这里学习所以我只是要问。
答案 0 :(得分:2)
您需要引入服务器选择的某种唯一标识符,并将其发送给客户端,以便“为了识别目的而行为并将其发回”。一个随机的长整数就足够了。
UDP既没有连接也没有身份验证/身份验证机制。如果你想要那些,使用TCP(但那些也可以强制...)