Cześć,
napisałam metodę Pinger, której zadaniem jest iterowanie po adresach urządzeń w sieci i poniekąd "pingowanie" w celu pozyskania o nich informacji (obecnie nazwę hosta).
Jeżeli na pingowanej maszynie jest uruchomiony serwer, to PCet pingujący otrzymuje odpowiedź z żądanymi informacjami. Jeżeli nie, to następuje timeout i metoda pinguje następny adres.
Problem w tym, że mimo ustawionego ReadTimeout na 50 ms, timeout trwa na maszynie z windą ~30-50 sekund, a na linuxach chyba ze 2-3 minuty, przez co cała metoda jest zupełnie nie praktyczna. Jak więc sprawić, żeby działało to szybciej?
Kod źródłowy:
public static void Pinger()
{
Console.WriteLine("Pinging devices...");
var ip = "192.168.1.";
for (int i = 2; i < 51; i++)
{
var constructedIp = ip + i;
string response = "";
Console.WriteLine($"Pinging: {constructedIp}");
try
{
// Connecting to server
TcpClient client = new TcpClient();
client.Connect(constructedIp, 6969);
var stream = client.GetStream();
stream.ReadTimeout = 50; // <--------- To tutaj nie chce działać >:|
// Preparing buffer & reading server status message
var buffer = new byte[1024];
stream.Read(buffer, 0, buffer.Length);
response = Encoding.UTF8.GetString(buffer);
// if server is ready proceed with request
if (response.Contains("server_ready"))
{
var message = Encoding.UTF8.GetBytes("whos_there:0:0");
stream.Write(message, 0, message.Length);
stream.Flush();
stream.Read(buffer, 0, buffer.Length);
response = Encoding.UTF8.GetString(buffer);
Console.WriteLine("Host response: " + response); // kiedyś tutaj będzie coś ambitniejszego :)
}
stream.Close();
client.Close();
}
catch (Exception)
{
Console.WriteLine($"{constructedIp} is unreachable.");
}
}
Console.WriteLine("Pinging finished.");
}
inb4:
- Dlaczego nie Ping.Send() + Dns.GetHostEntry() / Pinger() i wertowanie po odpowiadających adresach?
Taki był pierwotny pomysł, ale okazuje się, że o ile ping i dns działają świetnie na linuxach, o tyle na kompie z windą ping działa za wolno, a dns nie działa w ogóle. :|
Dlatego uznałam, że napiszę własnego upośledzonego pinga, który co prawda działa, ale jest zwyczajnie za wolny.
Z góry dzięki za wszelkie sugestie.