gpt4 book ai didi

c# - 如何在同一个套接字上发送消息和接收响应

转载 作者:太空狗 更新时间:2023-10-30 00:26:48 26 4
gpt4 key购买 nike

我有以下代码发送多播消息,然后等待响应发送到消息的来源地址。如果我在 Wireshark 中观察流量,我可以看到消息发送正常,并且响应返回到正确的 IP 和端口,但是套接字从未从接收线路返回,就像没有接收到响应一样。

    var multicastAddress = IPAddress.Parse("239.255.255.250");
var multicastPort = 1900;
var unicastPort = 1901;

using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
{
socket.Bind(new IPEndPoint(IPAddress.Any, unicastPort));
socket.Connect(new IPEndPoint(multicastAddress, multicastPort));
var thd = new Thread(() =>
{
try
{
while (true)
{
var response = new byte[8000];
EndPoint ep = new IPEndPoint(IPAddress.Any, unicastPort);
socket.ReceiveFrom(response, ref ep);
var str = Encoding.UTF8.GetString(response);
Devices.Add(new SsdpDevice() {Location = str});
}
}
catch
{
//TODO handle exception for when connection closes
}
});
socket.Send(broadcastMessage, 0, broadcastMessage.Length, SocketFlags.None);
thd.Start();
Thread.Sleep(30000);
socket.Close();
}

我知道我应该在套接字类上使用异步方法并且需要停止依赖 Thread.Sleep 但我只想在整理代码之前让一个简单的示例工作。

最佳答案

加文,检查一下:

  • 不要使用不同的端口。您希望如何在一台上多播并在另一台上接收?
  • 不要使用Connect(),多播是无连接消息传递(就像广播一样)。
  • Bind() 之后将套接字选项设置为多播。
  • 使用 SendTo() 而不是 Send(),这在这种情况下不起作用。
  • 首先开始接收(即使是阻塞模式,也是不同的端点),然后发送。

还有一个简单的工作示例:

var broadcastMessage = Encoding.UTF8.GetBytes("Hello multicast!");
var multicastAddress = IPAddress.Parse("239.255.255.250");
var signal = new ManualResetEvent(false);
var multicastPort = 1900;

using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
{
var multicastEp = new IPEndPoint(multicastAddress, multicastPort);
EndPoint localEp = new IPEndPoint(IPAddress.Any, multicastPort);

// Might want to set this:
//socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
socket.Bind(localEp);
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(multicastAddress, IPAddress.Any));
// May want to set this:
//socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 0); // only LAN
var thd = new Thread(() =>
{
var response = new byte[8000];
socket.ReceiveFrom(response, ref localEp);
var str = Encoding.UTF8.GetString(response).TrimEnd('\0');
Console.WriteLine("[RECV] {0}", str);
signal.Set();
Console.WriteLine("Receiver terminating...");
});
signal.Reset();
thd.Start();

socket.SendTo(broadcastMessage, 0, broadcastMessage.Length, SocketFlags.None, multicastEp);
Console.WriteLine("[SEND] {0}", Encoding.UTF8.GetString(broadcastMessage));
signal.WaitOne();
Console.WriteLine("Multicaster terminating...");
socket.Close();
Console.WriteLine("Press any key.");
Console.ReadKey();
}

关于c# - 如何在同一个套接字上发送消息和接收响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9416241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com