Сервер не получает сообщение с Rdm Socket - PullRequest
0 голосов
/ 26 января 2020

Я никогда не использовал SocketType.Rdm раньше. После того, как я некоторое время гуглил, я обнаружил, что я должен объявить Socket вот так в C#:

new Socket (AddressFamily.InterNetwork, SocketType.Rdm, (ProtocolType ) 113);

должны иметь установленное ядро ​​MSMQ, поддержку триггеров и многоадресной рассылки в Windows 10 и запускать 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.Dgram и ProtocolType.Udp он работает нормально. Я не уверен, что он на самом деле делает, но похоже, что с SocketType.Rdm и (ProtocolType)113 Клиент может подключиться к серверу и успешно отправить сообщение, НО сервер не получает сообщение клиента. Что еще мне нужно сделать, чтобы он работал с SocketType.Rdm?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...