服务器未通过Rdm套接字接收消息

时间:2020-01-26 08:45:11

标签: c# sockets

我以前从未使用过SocketType.Rdm。谷歌搜索一段时间后,到目前为止,我已经在Socket中声明了C#

新套接字(AddressFamily.InterNetwork,SocketType.Rdm, (ProtocolType)113);

必须在Windows 10上安装MSMQ Core,触发器和多播支持,并以管理权限启动Visual Studio。这是我的服务器的代码:

public partial class MainWindow : Window
{
    List<Socket> servers = new List<Socket>();

    public MainWindow()
    {
        InitializeComponent();
        Start(null, null);
    }

    void Start(object sender, RoutedEventArgs e)
    {
        for (int i = 1; i < 4; i++)
        {
            var server = new Socket(AddressFamily.InterNetwork, SocketType.Rdm, (ProtocolType)113) { Blocking = false };
            //var server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) { Blocking = false };
            var endpoint = new IPEndPoint(IPAddress.Any, i * 1000);
            server.Bind(endpoint);
            Debug.WriteLine("Started");
            servers.Add(server);
        }
        Task.Run(Receive);
    }

    void Receive()
    {
        while (true)
        {
            var socks = new List<Socket>(servers);
            Socket.Select(socks, null, null, -1);
            foreach (var s in socks)
            {
                EndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
                var buff = new byte[64];
                s.ReceiveFrom(buff, ref endPoint);
                s.SendTo(buff, endPoint);
            }
        }
    }
}

这是客户:

public partial class MainWindow : Window
{
    Socket client;
    public ObservableCollection<string> Collection { get; set; }

    public MainWindow()
    {
        Collection = new ObservableCollection<string>();
        DataContext = this;
        InitializeComponent();
    }

    // Connect Button's Click Handler
    void Connect(object sender, RoutedEventArgs e)
    {
        int port = Convert.ToInt32(portText.Text);
        var server = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
        client = new Socket(AddressFamily.InterNetwork, SocketType.Rdm, (ProtocolType)113);
        //client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) { Blocking = false };
        client.Connect(server);
        Debug.WriteLine("Connected");
        Task.Run(Receive);

    }

    // Send Button's Click Handler
    void Send(object sender, RoutedEventArgs e)
    {
        client.Send(Encoding.ASCII.GetBytes(message.Text));
    }

    void Receive()
    {
        while (true)
        {
            if (client.Poll(-1, SelectMode.SelectRead))
            {
                var buff = new byte[64];
                client.Receive(buff);
                App.Current.Dispatcher.Invoke(() => Collection.Add(Encoding.ASCII.GetString(buff)));
            }
        }
    }
}

使用SocketType.DgramProtocolType.Udp可以正常工作。我不确定它的实际作用,但是使用SocketType.Rdm(ProtocolType)113时,客户端可以连接到服务器,并且可以成功发送消息,但服务器未接收到客户端的消息。要使其与SocketType.Rdm一起使用,我还需要做什么?

0 个答案:

没有答案
相关问题