UdpClient仅在同一台计算机上的一个实例中接收dgram

时间:2020-04-05 20:04:08

标签: c# udp udpclient

我对套接字编程还很陌生,并且认为我不了解关键部分。 我碰到了this Microsoft example。它显示了运行UDP服务器和客户端以侦听DGRAM包的示例。 (我需要使用UDP,因为我正在尝试流式传输游戏中玩家的位置。)

当我在同一台计算机上启动一台服务器和两个客户端时,会出现我的问题:UDPClient的两个不同实例无法使用同一端口。我明白了 但是,如果我为每个UDPClient尝试不同的端口,则假定在同一台计算机上侦听同一服务器的UDPClients实例可以为两个。 但是,第二个实例却没有收到任何UDP包。

所以我的问题是:我将如何更改以下代码,以便能够运行两个客户端在一台计算机上监听一台服务器的广播消息?

这是我的服务器代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        IPAddress broadcast = IPAddress.Parse("192.168.1.255");

        byte[] sendbuf = Encoding.ASCII.GetBytes(args[0]);
        IPEndPoint ep = new IPEndPoint(broadcast, 11000);

        s.SendTo(sendbuf, ep);

        Console.WriteLine("Message sent to the broadcast address");
    }
}

这是我的客户代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class UDPListener
{
    private const int listenPort = 11000;

    private static void StartListener()
    {
        UdpClient listener = null;

        var tries = 0;
        while (listener == null){
            try
            {
                listener = new UdpClient(listenPort+tries);
            }
            catch (Exception)
            {
                tries++;
                continue;
            }
        }

        IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);

        try
        {
            while (true)
            {
                Console.WriteLine("Waiting for broadcast");
                byte[] bytes = listener.Receive(ref groupEP);

                Console.WriteLine($"Received broadcast from {groupEP} :");
                Console.WriteLine($" {Encoding.ASCII.GetString(bytes, 0, bytes.Length)}");
            }
        }
        catch (SocketException e)
        {
            Console.WriteLine(e);
        }
        finally
        {
            listener.Close();
        }
    }

    public static void Main()
    {
        StartListener();
    }
}

0 个答案:

没有答案
相关问题