private static FoundServerInformation BroadcastPing(IPAddress broadcastAddress, int port) {
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) {
SendTimeout = OptionLanSocketTimeout,
ReceiveTimeout = OptionLanSocketTimeout,
Blocking = false
}) {
EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
var buffer = new byte[3];
try {
socket.SendTo(BitConverter.GetBytes(200), SocketFlags.DontRoute, new IPEndPoint(broadcastAddress, port));
if (socket.Poll(OptionLanPollTimeout * 1000, SelectMode.SelectRead)) {
socket.ReceiveFrom(buffer, ref remoteEndPoint);
}
} catch (SocketException) {
return null;
}
if (buffer[0] != 200 || buffer[1] + buffer[2] <= 0) {
return null;
}
var foundServer = remoteEndPoint as IPEndPoint;
if (foundServer == null) {
return null;
}
return new FoundServerInformation {
Ip = foundServer.Address.ToString(),
Port = BitConverter.ToInt16(buffer, 1)
};
}
}