0

私はここ数日、いくつかの同様の質問をし、いくつかの本当に大きな助けを受けました。私は今、自分の問題をかなりよく理解していますが、問題にぶつかったようです。TCP接続とUDP接続の両方を使用するクライアントサーバーアプリケーションを作成しました。TCP接続はLANとWANの両方で正常に機能しますが、UDP接続はWANでフェイルオーバーします。以前に尋ねた質問に基づいて、サーバーが通信を受信したEndPointのクライアントに応答する必要があることに気付きました。私はすべてをそのように機能するように設定しました。質問の後にコードを投稿します。私の問題は、クライアント接続からEndPointを使用していて、クライアントが最初に接続を確立している間、UDP接続を確立できないことです。1つのネットワークで機能しているように見えましたが、私が試した他のすべてのネットワークで失敗しました。これを理解する上での助けはありがたいです。これがコードです。

サーバーでUDPメッセージを受信する

private void receiveUDP()
    {
        System.Net.IPEndPoint test = new System.Net.IPEndPoint(System.Net.IPAddress.Any,UDP_PORT);
        System.Net.EndPoint serverIP = (System.Net.EndPoint)test;
        trans.Bind(serverIP);
        System.Net.IPEndPoint ipep = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 0);
        System.Net.EndPoint Remote = (System.Net.EndPoint)ipep;

        while (true)
        {

            byte[] content = new byte[1024];

            int recv = trans.ReceiveFrom(content,ref Remote);

            int portNum = ((System.Net.IPEndPoint)Remote).Port;
            string message = Encoding.ASCII.GetString(content);
            string[] data = message.Split((char)124);
            //UpdateStatus(data[0] + data[1]);

            UserConnection sender = (UserConnection)clients[data[0]];
            if (sender.PortNumber != portNum)
                sender.PortNumber = portNum;
            if (sender.RemoteEnd != Remote)
            {
                sender.RemoteEnd = Remote;//Stores the EndPoint from the client connection
            }
            if (data.Length > 2)
            {
                OnLineRecieved(sender, data[1] + "|" + data[2]);
            }
            else
            {
                OnLineRecieved(sender, data[1]);
            }
        }
    }

クライアントはここでリッスンします

private void receiveUDP()
    {
        System.Net.IPEndPoint test = new System.Net.IPEndPoint(System.Net.IPAddress.Any,UDP_PORT_NUMBER);
        System.Net.EndPoint serverIP = (System.Net.EndPoint)test;
        server.Bind(serverIP);
        server.Ttl = 50;

        EndPoint RemoteServ = (EndPoint)servIP;
        while (true)
        {
            byte[] content = new byte[1024];
            int  data = server.ReceiveFrom(content, ref RemoteServ);

            string message = Encoding.ASCII.GetString(content);
            result = message;

            ProcessCommands(message);

        }
    }

編集:サーバーの送信機能

public void SendData(string data)
    {
        if (RemoteEnd != null)//RemoteEnd is refreshed every time the client sends a UDP message
//Each Clients RemoteEnd is stored in a collection of Client objects in a server hashtable
        {
            //ipep = new IPEndPoint(ipAdd, PortNumber);
            byte[] dataArr = Encoding.ASCII.GetBytes(data);

            trans.SendTo(dataArr, dataArr.Length, SocketFlags.None, RemoteEnd);
        }
    }
4

2 に答える 2

1

多くの問題がある可能性があります。UDPは、送信ペーシング、再送信、または確認応答を提供しないことを忘れないでください。したがって、それらが必要な場合、それらを提供する必要があります。クライアントに最初に送信させてから、各クエリへの応答を待つ場合、最初に失われたパケットによって接続が切断されます。

また、問題を説明するのを忘れていました。接続に失敗したとおっしゃっていますが、それはどういう意味ですか?サーバーはクライアントの最初のパケットを受信しますか?クライアントはサーバーの最初の応答を受信しますか?

于 2011-08-13T16:18:01.403 に答える
1

これがプログラミングの問題なのか、ネットワーク構成の問題なのかを判断する必要があります。

私がすることは、サーバーマシンでクライアントアプリを実行し、クライアントマシンでサーバーアプリを実行することです(そして、それらが接続するホストを切り替えます)。

サーバーアプリがクライアントアプリからUDPメッセージを受信しなくなった場合は、ネットワーク構成に問題があります。

サーバーアプリがクライアントアプリからメッセージを受信できる場合は、プログラミングに問題があります。

于 2011-08-13T19:01:05.910 に答える