0

ソケットを開いたままにせずに、以前の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);
}

クライアントはサーバーに(一時的な)userIDを要求でき、サーバーはそれをデータベースに追加し、それが完了するとクライアントに通知します。ただし、メモリを変更するアプリケーションは「ハッカー」が他のユーザーのものにアクセスする可能性があるため、クライアントがリクエストを行うときに独自のユーザーIDを送信することはできません。

ソケットは開いたままではないため、クライアントがサーバーに何かを送信するたびにIPEndPoint.Portが変更されるため、それを追跡することはできません。userIDリクエストでユーザー名/パスを作成し、その後userIDを含むすべてのリクエストでそれらを送信することでそれを行うことができましたが、それはばかげています。

では、クライアントごとにスレッドを開いたままにせずにこれを行う方法はありますか?UDPは一方通行であるはずなので、私はおそらくここで本当に奇妙なことをしているでしょうが、私は学ぶためにここにいるので、私はただ尋ねなければなりませんでした。

4

1 に答える 1

2

サーバーが「動作し、識別のために送り返す」ために、サーバーによって選択されてクライアントに送信される、ある種の一意の識別子を導入する必要があります。ランダムな長整数で十分です。

UDPには、接続も識別/認証メカニズムもありません。それらが必要な場合は、TCPを使用してください(ただし、それらをブルートフォースすることもできます...)

于 2012-09-13T11:07:29.987 に答える