3

要求 (サイズは 18 バイト) を受け取り、クライアントに何か (サイズは 7 バイト) を送信するコンソール アプリケーションを作成しようとしています。私は一生、これを機能させることができないようです。データは正常に受信できますが、送り返すデータはクライアントに届きません。

これが私のコードです

 static void Main(string[] args)
 {
        // Data to return
        byte[] ret = { 0xfe, 0xfd, 0x09, 0x00, 0x00, 0x00, 0x00 };

        // tell the user that we are waiting
        Console.WriteLine("Waiting for UDP Connection...");

        // Create a new socket to listen from
        Socket Skt = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        Skt.EnableBroadcast = true;
        Skt.Bind(new IPEndPoint(IPAddress.Loopback, 27900));

        try
        {
            // Blocks until a message returns on this socket from a remote host.
            Byte[] receiveBytes = new byte[48];
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint senderRemote = (EndPoint)sender;

            Skt.ReceiveFrom(receiveBytes, ref senderRemote);
            string returnData = Encoding.UTF8.GetString(receiveBytes).Trim();

            Console.WriteLine("This is the message you received " + returnData.ToString());

            // Sent return data
            int sent = Skt.SendTo(ret, senderRemote);
            Console.WriteLine("Sent {0} bytes back", sent);
            Skt.Close();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }

        Console.ReadLine();
    }

誰か私にいくつかの指針を教えてください。

4

2 に答える 2

2

これが私が修正したサンプルコードです。このサンプルから送受信できることがわかります。メソッド テストは、シミュレーション用に別のスレッドで作成した別のプロセスである可能性があるクライアントとして機能しています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Data to return
        byte[] ret = { 0xfe, 0xfd, 0x09, 0x00, 0x00, 0x00, 0x00 };

        // tell the user that we are waiting
        Console.WriteLine("Waiting for UDP Connection...");

        // Create a new socket to listen from
        Socket Skt = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        Skt.EnableBroadcast = true;
        Skt.Bind(new IPEndPoint(IPAddress.Loopback, 27900));

        try
        {
            // Blocks until a message returns on this socket from a remote host.
            Byte[] receiveBytes = new byte[48];
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint senderRemote = (EndPoint)sender;

            Thread thr = new Thread(new ThreadStart(Test));
            thr.Start();
            Skt.ReceiveFrom(receiveBytes, ref senderRemote);
            string returnData = Encoding.UTF8.GetString(receiveBytes).Trim();

            Console.WriteLine("This is the message you received " + returnData.ToString());

            // Sent return data
            int sent = Skt.SendTo(ret, senderRemote);
            Console.WriteLine("Sent {0} bytes back", sent);
            Skt.Close();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }

        Console.ReadLine();

        }



        public static void Test()
        {
            byte[] ret = { 0xfe, 0xfd, 0x09, 0x00, 0x00, 0x00, 0x00 };
            Socket Skt = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            Skt.EnableBroadcast = true;
            IPEndPoint test=new IPEndPoint(IPAddress.Loopback, 27900);

            int sent = Skt.SendTo(ret, test);
            try
            {
                // Blocks until a message returns on this socket from a remote host.
                Byte[] receiveBytes = new byte[48];
                IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
                EndPoint senderRemote = (EndPoint)sender;

                Skt.ReceiveFrom(receiveBytes, ref senderRemote);
                string returnData = Encoding.UTF8.GetString(receiveBytes).Trim();

                Console.WriteLine("This is the message you received " + returnData.ToString());

                // Sent return data
                //int sent = Skt.SendTo(ret, senderRemote);
                Console.WriteLine("Sent {0} bytes back", sent);
                Skt.Close();



            }
            catch (Exception ex)
            {
            }
        }

    }
}
于 2013-02-02T02:43:58.370 に答える
-1

クライアント コードも確認しないと、問題がどこにあるのかを特定するのは困難です。ただし、ネットワーク ライブラリnetworkcomms.netを使用して実用的なソリューションを提供できます。サーバーのコードは次のようになります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using NetworkCommsDotNet;

namespace UPDServer
{
    class Program
    {
        static void Main(string[] args)
        {
            NetworkComms.AppendGlobalIncomingPacketHandler<string>("Message", (packetHeader, connection, incomingString) => 
            {
                Console.WriteLine("This is the message you received " + incomingString);
                connection.SendObject("Message", incomingString + " relayed by server.");
            });

            UDPConnection.StartListening(true);

            Console.WriteLine("Server ready. Press any key to shutdown server.");
            Console.ReadKey(true);
            NetworkComms.Shutdown();
        }
    }
}

クライアントの場合:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using NetworkCommsDotNet;

namespace UDPClient
{
    class Program
    {
        static void Main(string[] args)
        {
            string messageToSend = "This is a message To Send";
            string messageFromServer = UDPConnection.GetConnection(new ConnectionInfo("127.0.0.1", 10000), UDPOptions.None).SendReceiveObject<string>("Message", "Message", 2000, messageToSend);
            Console.WriteLine("Server said '{0}'.", messageFromServer);

            Console.WriteLine("Press any key to exit.");
            Console.ReadKey(true);
            NetworkComms.Shutdown();
        }
    }
}

「NetworkCommsDotNet を使用する」リファレンスに追加できるように、Web サイトから NetworkCommsDotNet DLL をダウンロードする必要があることは明らかです。また、クライアントの例のサーバー IP アドレスが現在「127.0.0.1」であることも確認してください。これは、サーバーとクライアントの両方を同じマシンで実行する場合に機能するはずです。詳細については、入門またはクライアント サーバー アプリケーションの作成方法に関する記事を参照してください。

于 2013-02-02T12:25:29.333 に答える