Носок показывает противоречивые / невозможные результаты после повторного использования - PullRequest
0 голосов
/ 14 февраля 2010

Привет всем, я пытаюсь определить состояние некоторых серверов с течением времени. Вот мой код:

static void Main(string[] args)
    {
        byte[] readstream = new byte[100];
        byte[] sendstream = Encoding.ASCII.GetBytes("PLAYER_JOINED");
        string[] IPs = new string[] { "24.15.169.211", "69.198.255.121", "219.79.244.225" };
        string[] Name = new string[10];
        string[] Port = new string[10];
        int timeout = 5000;

        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        s.ReceiveTimeout = timeout;

        while (true)
        {
            int i = 0;
            foreach (string str in IPs)
            {

                IPAddress address = IPAddress.Parse(str);
                IPEndPoint CheckingServer = new IPEndPoint(address, 8190);

                try
                {

                    s.Connect(CheckingServer);
                    s.Send(sendstream);
                    s.Receive(readstream);
                    Console.WriteLine(Encoding.ASCII.GetString(readstream));
                    Console.WriteLine("{0}: Server Up", IPs[i]);

                }

                catch
                {

                    Console.WriteLine("{0}: NO SUCH SERVER", IPs[i]);

                }


                i++;
            }

            Thread.Sleep(1000);

        }


    }

Когда я запускаю этот код, он показывает, что 24.15.169.211 работает в первый раз, когда он запускается через него, но затем возвращается к отсутствию такого сервера в последующих тестах. Почему?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2010

Потому что вы пытаетесь подключить уже подключенную розетку. Распечатайте исключение, и вы увидите, что идет не так. Измените свое предложение catch на

}catch (Exception ex) {
   Console.WriteLine(ex);
}
0 голосов
/ 14 февраля 2010

Вот немного измененная версия, использующая TcpClient вместо необработанных сокетов:

var ipsToCheck = new[] { "24.15.169.211", "69.198.255.121", "219.79.244.225" };
while (true)
{
    foreach (var ip in ipsToCheck)
    {
        using (var tcpClient = new TcpClient(AddressFamily.InterNetwork))
        {
            tcpClient.ReceiveTimeout = 5000;

            try
            {
                tcpClient.Connect(IPAddress.Parse(ip), 8190);
                using (var stream = tcpClient.GetStream())
                {
                    var writer = new StreamWriter(stream);
                    var reader = new StreamReader(stream);
                    writer.Write("PLAYER_JOINED");
                    var buffer = new char[100];
                    reader.Read(buffer, 0, buffer.Length);
                    Console.WriteLine(buffer);
                    Console.WriteLine("{0}: Server Up", ip);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error connecting to {0}: {1}", ip, ex.Message);
            }
        }
    }
    Thread.Sleep(1000);
}
...