자동 검색 메커니즘을 구현하는 응용 프로그램이 있는데 UdpClient에 문제가 있습니다. 응용 프로그램의 단일 인스턴스가 열려있는 한 제대로 작동합니다. 그러나 두 번째 인스턴스가 열리면 첫 번째 인스턴스 만 유니 캐스트 패킷을 수신합니다. 흥미롭게도 같은 메커니즘을 구현하는 유사한 응용 프로그램에는이 문제가없는 것 같습니다. 어떤 제안?UdpClient는 여러 수신기에서 데이터를 수신합니다.
class AutoDiscovery
{
private UdpClient Udp;
private IPEndPoint BroadcastEP = new IPEndPoint(IPAddress.Broadcast, 1234);
private List<byte> AutoDiscoverPacket = new List<byte>();
public ObservableCollection<DiscoveredDevice> DiscoveredDevices = new ObservableCollection<DiscoveredDevice>();
public AutoDiscovery()
{
Udp = new UdpClient();
Udp.ExclusiveAddressUse = false;
Udp.EnableBroadcast = true;
Udp.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
Udp.Client.Bind(new IPEndPoint(IPAddress.Any, 1234));
AutoDiscoverPacket.AddRange(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });
AutoDiscoverPacket.AddRange(Encoding.ASCII.GetBytes("SomeStaticString"));
while (AutoDiscoverPacket.Count < 123)
{
AutoDiscoverPacket.Add(0x00);
}
ReceiveDataAsync(ReceiveDataCallback);
}
~AutoDiscovery()
{
if (Udp != null)
{
try
{
Udp.Close();
}
finally
{
}
}
}
public void Discover()
{
DiscoveredDevices.Clear();
Udp.Send(AutoDiscoverPacket.ToArray(), AutoDiscoverPacket.Count, BroadcastEP);
}
private void ReceiveDataAsync(Action<UdpReceiveResult> Callback)
{
Task.Run(async() =>
{
try
{
while (true)
{
//IPEndPoint object will allow us to read datagrams sent from any source.
UdpReceiveResult receivedResults = await Udp.ReceiveAsync();
Callback(receivedResults);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
});
}
private void ReceiveDataCallback(UdpReceiveResult Result)
{
// Do stuff here
}
}
}
저는 한 번에 하나의 응용 프로그램 만 특정 IP/포트에 바인딩 될 수 있다고 생각합니다. 아마도이 방향으로 검색을 시도해 볼 수 있습니다. – casiosmu