0

現在、この関数を使用してサーバーからクライアントにデータを送信しています

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);
}

しかし、これは、宛先IP /ポートがデータを受信するために1つのクライアントしか開いていないことを意味します.2つのクライアントが開いていると、1つのクライアントが別のクライアント向けのデータを取得できるためです(私が正しい場合)..どうすれば解決できますかこれ?

受信機能:

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);
                parseMessage(message);
            }
        }
    });
    t.Start();
}
4

2 に答える 2

2

1) サーバーが接続を受け入れるための「既知の」ポートを持つように、ある種のプロトコルを実装する必要があります。このポートを使用して、クライアントが接続する必要がある別のポートをクライアントに通知します。クライアントごとに異なるポートを使用します。

クライアントは 11000 でサーバーに接続します。サーバーはクライアントに一意のポートを割り当てます。最初のクライアントには 11001 としましょう。次に、サーバーは 11001 で接続を開きます。クライアントは 11000 で接続を閉じ、11001 で新しい接続を開き、データを受信します。

2) なぜ UDP なのか?

于 2012-09-14T09:52:41.657 に答える
0

なぜ新しいソケットを開く必要があるのか​​、まったくわかりません。クライアントから送信された最初のパケットから、各クライアントのアドレスとポートがすでに用意されています。そのaddress:portにパケットを送信するだけです。追加のポートを設定するという他の提案もまったくありません。

于 2012-09-17T22:33:03.503 に答える