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