1

これが私の問題です。UDPサーバーを作成しようとしています-クライアントとのやり取りをテストします。クライアントからサーバーにデータを送信してもらいたいのですが、サーバーが保持しているデータと一致する場合、サーバーは応答を送信します。シンプルですね。ここにいくつかのコードがあります:

クライアント送受信コード:

void TestUDP()
    {
        Socket sock_addr = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        IPEndPoint srver_endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 36);
        string numbers = "1.2.3.4";
        byte[] srver_req = Encoding.UTF8.GetBytes("TEST|" + numbers);

        sock_addr.SendTo(srver_req, srver_endpoint);

        EndPoint ref_endpoint = (EndPoint)srver_endpoint;
        byte[] req_reply = new byte[1000];
        sock_addr.ReceiveFrom(req_reply, ref ref_endpoint);

        string reply = Encoding.UTF8.GetString(req_reply).Trim();

        string[] s_str = reply.Split('|');

        if (s_str[0] == "HEY")
        {
            MessageBox.Show("HEY");
        }
        else
        {
            MessageBox.Show("NO");
        }
    }

いくつかのサーバーコード:

public void start()
    {
        udp_sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        udp_sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);

        udp_thr = new Thread(udpListen);
        udp_thr.Start();
    }

    void udpListen()
    {
        byte[] data = new byte[1024];
        IPEndPoint ip = new IPEndPoint(IPAddress.Any, 36);

        udp_sock.Bind(ip);

        IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
        EndPoint Remote = (EndPoint)(sender);

        while (true)
        {
            udp_sock.ReceiveFrom(data, ref Remote);

            Parse(data, Remote);
        }
    }

    void Parse(byte[] data, EndPoint Remote)
    {
        string decData = Encoding.UTF8.GetString(data).Trim();
        string[] s_str = decData.Split('|');
        byte[] sendBuffer = new byte[] { };

        switch (s_str[0])
        {
            case "TEST":
                string data1 = s_str[1];

                if (data1 == "1.2.3.4")
                {
                    sendBuffer = Encoding.UTF8.GetBytes("HEY|");
                }
                else if(data1 != "1.2.3.4")
                {
                    sendBuffer = Encoding.UTF8.GetBytes("NO|");
                }

                udp_sock.SendTo(sendBuffer, Remote);
                break;
        }
    }

問題は、常に「いいえ」と表示されることです。理由はわかりません。私にはこれがうまくいくように見えますが、何が間違っていますか?? ブロードキャスト リクエストもこれで処理したいので、このソケットをブロードキャストに配置しました。問題ありますか?

4

1 に答える 1

3

まず、 「正しい」か「間違っている」かを単に知るのではなく、実際のデータを出力する診断を追加する必要があります。

次に、実際の問題は、 の結果を無視していることですudp_sock.ReceiveFrom。これにより、実際に受信したバイト数がわかります。現在、常に1024 バイトすべてを文字列に変換しています。これは、受信したばかりではないデータが末尾にある可能性が高いことを意味します。使用するだけTrim()では、それに対抗する良い方法ではありません。U+0000 を空白としてカウントしませTrim()ん。また、たとえカウントしたとしても、適切なアプローチではありません。他のことは別として、同じバッファを後で再利用しているため、長いメッセージを受け取ってから短いメッセージを受け取った場合1つは、混合物になります。

あなたがしたい:

// TODO: Fix your variable names, which are inconsistent non-idiomatic
int bytesRead = udp_sock.ReceiveFrom(data, ref Remote);
Parse(data, bytesRead, Remote);

次のように変更Parseします。

void Parse(byte[] data, int bytesRead, EndPoint remote)
{
    string text = Encoding.UTF8.GetString(data, 0, bytesRead);
    ...
}

クライアントとサーバーの両方でそれを行う必要があります。

また、if/の最初のブランチ「1.2.3.4」であるelseかどうかをチェックすることを考えると、そうでないことを確認する必要はありませんdata1

于 2013-09-28T06:09:01.833 に答える