C# 知道哪个UDP客户端是哪个

C# 知道哪个UDP客户端是哪个,c#,udp,C#,Udp,是否可以在不保持套接字打开的情况下识别较早的UDP客户端?我想将一个整数ID链接到每个唯一的客户机,但我不想让任何其他线程保持打开状态 //接收(服务器) //发送(客户端) 客户机可以从服务器请求(临时)用户ID,服务器会将其添加到其数据库中,并在完成此操作时通知客户机。然而,我不能让客户端在发出请求时发送它自己的用户ID,因为任何改变内存的应用程序都意味着“黑客”可以访问其他用户的东西 由于套接字没有保持打开状态,每次客户端向服务器发送内容时,IPEndPoint.Port都会发生变化,因此

是否可以在不保持套接字打开的情况下识别较早的UDP客户端?我想将一个整数ID链接到每个唯一的客户机,但我不想让任何其他线程保持打开状态

//接收(服务器)

//发送(客户端)

客户机可以从服务器请求(临时)用户ID,服务器会将其添加到其数据库中,并在完成此操作时通知客户机。然而,我不能让客户端在发出请求时发送它自己的用户ID,因为任何改变内存的应用程序都意味着“黑客”可以访问其他用户的东西

由于套接字没有保持打开状态,每次客户端向服务器发送内容时,IPEndPoint.Port都会发生变化,因此我无法跟踪它。我可以通过在一个userID请求上创建一个username/pass,然后在每个涉及userID的请求上发送这些username/pass来完成它,但那将是愚蠢的


那么,有没有办法在不为每个客户机打开线程的情况下做到这一点?我可能在这里做了一些非常奇怪的事情,因为UDP应该是单向的,但我在这里学习,所以我不得不问。

您需要引入某种由服务器选择的唯一标识符,并将其发送给客户端,以便它“进行操作并将其发送回以进行识别”。一个随机长整数就足够了


UDP既没有连接,也没有标识/身份验证机制。如果您想要这些,请使用TCP(但也可以使用暴力手段…

如果攻击者控制您的应用程序运行的机器,那么您绝对无法百分之百地击败它们。那么为什么不使用userID方案呢?你说的“不保持套接字打开”是什么意思?在UDP中没有连接,所以服务器只需要一个UDP套接字,它总是打开的。@EJP盲目地从另一个问题的答案中复制了它,所以,这没有任何意义。我认为它的意思是“不在UDP连接上构建会话”或者类似的东西。我的困惑,抱歉,那安全吗?我知道几率非常小,但如果有人猜测/粗暴地强迫别人的随机整数怎么办;那将意味着麻烦。。。当然,密码也不是这样,因为基本上就是这样;不可见的临时密码。那么这是唯一的选择吗?如果你想变得非常棒,你可以用私钥加密随机整数并发送密文。你是说创建MD5散列还是什么?或者更复杂的事情?不能说“密文”这个词很有用。密文是一个加密字符串。看这里:
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);
}