Я никогда не использовал 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
?