public static Tuple<int, TimeSpan> TryToPingServer(string ip, int port, int timeout) {
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) {
SendTimeout = timeout,
ReceiveTimeout = timeout
}) {
var buffer = new byte[3];
try {
socket.SendTo(BitConverter.GetBytes(200), new IPEndPoint(IPAddress.Parse(ip), port));
var timer = Stopwatch.StartNew();
socket.Receive(buffer);
return buffer[0] != 200 || buffer[1] + buffer[2] <= 0 ? null :
new Tuple<int, TimeSpan>(BitConverter.ToInt16(buffer, 1), timer.Elapsed);
} catch (Exception) {
return null;
}
}
}
}