gpt4 book ai didi

c# - UDP 在空闲端口上发送/接收

转载 作者:太空宇宙 更新时间:2023-11-03 13:18:20 42 4
gpt4 key购买 nike

在一个项目中,有一个设备在特定的 UDP 端口上监听并回答发送者端口。

对于发送方和接收方我希望系统选择一个空闲端口,所以我有以下代码:

[请原谅大量的代码,但这是显示发生的行为的最小示例]

发送代码:

public class UdpSender
{
public int Port = 0; // some initially random port
public UdpClient UdpServer { get; set; }

public UdpSender()
{
UdpServer = CreateUdpClient();

// save the portnumber chosen by system to reuse it
Port = ((IPEndPoint)(UdpServer.Client.LocalEndPoint)).Port;
}

private UdpClient CreateUdpClient()
{
if (UdpServer != null)
{
UdpServer.Close();
}

IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, Port);

var udpServer = new UdpClient();
udpServer.ExclusiveAddressUse = false;
udpServer.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpServer.Client.Bind(localEndPoint);

return udpServer;
}

public void Send(byte[] arr)
{
UdpServer = CreateUdpClient();

int remotePortNumber = 6565;
var remoteEndPoint = new IPEndPoint(IPAddress.Broadcast, remotePortNumber);

try
{
UdpServer.Send(arr, arr.Length, remoteEndPoint);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}

UdpServer.Close();
}
}

接收码:

public class UDPListener
{
private static int portNumber;
private UdpClient udpClient = null;
public List<DeviceData> DeviceList = new List<DeviceData>();

public UDPListener(int port)
{
portNumber = port;
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, portNumber);

udpClient = new UdpClient();
udpClient.ExclusiveAddressUse = false;

udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.Client.Bind(localEndPoint);
udpClient.Client.ReceiveBufferSize = 1 << 23;
}

public void StartListening()
{
this.udpClient.BeginReceive(Receive, new object());
}

private void Receive(IAsyncResult ar)
{
IPEndPoint ip = new IPEndPoint(IPAddress.Any, portNumber);
byte[] bytes = udpClient.EndReceive(ar, ref ip);
string message = Encoding.ASCII.GetString(bytes);
DeviceList.Add(new DeviceData(message));
StartListening();
}
}

整合:

public class DeviceFinder
{
public IEnumerable<DeviceData> Find()
{
var sender = new UdpSender();
int port = sender.Port;

var listener = new UDPListener(port);
listener.StartListening();

sender.Send(new byte[] { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6 });

System.Threading.Thread.Sleep(5000); // wait some time for answers

return listener.DeviceList;
}
}

Receive 方法永远不会用这种方法调用。但是在 Wireshark 中,我可以看到来自设备的答案。

这种方法有什么问题?

在使用这种方法之前,我使用了一个固定端口,并且还添加了对 CreateUdpClient 的调用。似乎与此有关,但我无法弄清楚。在我刚刚创建一个 UdpClient 之前,它的固定端口就在接收/发送方法中。

以前的版本可以看in this question .这非常有效。但我担心如果固定端口已在使用中,它就不起作用,因此采用了这种新方法。

最佳答案

只需指定零作为您自己的端口号。系统会在您绑定(bind)或发送时分配一个。源端口号将伴随数据报发送给对等方,对等方应回复它。

关于c# - UDP 在空闲端口上发送/接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25243781/

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