При соединении и получении информации о сервере интернет зависает намертво

396
10 августа 2017, 21:11

Добрый день или вечер! У меня такая проблема: Есть 1000 примерно серверов к которым я подключаюсь и беру некоторую информацию Подключение находится как бы в отдельном потоке, но когда достигает примерно говоря 140-го сервера, то соединение с интернетом просто зависает. Очень похоже на забитость канала.

Используется вот такой класс для соединения

namespace SampQueryApi
{
class SampQuery
{
    IPAddress serverIp;
    IPEndPoint serverEndPoint;
    Socket svrConnect;
    string IP;
    ushort Port;
    bool bDebug = false;
    DateTime TransmitMS = new DateTime();
    DateTime ReceiveMS = new DateTime();
    public SampQuery(string ip, ushort port, char packet_type, bool console_debug = false)
    {
        MemoryStream stream = new MemoryStream();
        BinaryWriter writer = new BinaryWriter(stream);
        try
        {
            serverIp = new IPAddress(IPAddress.Parse(ip).GetAddressBytes());
            serverEndPoint = new IPEndPoint(serverIp, port);
            svrConnect = new Socket(serverEndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
            svrConnect.SendTimeout = 5000;
            svrConnect.ReceiveTimeout = 5000;
            IP = ip;
            Port = port;
            bDebug = console_debug;
            if (bDebug)
                Console.Write("Соединение к "/*Connecting to*/ + ip + ":" + port + Environment.NewLine);
            try
            {
                using (stream)
                {
                    using (writer)
                    {
                        string[] szSplitIP = IP.ToString().Split('.');
                        writer.Write("SAMP".ToCharArray());
                        writer.Write(Convert.ToByte(Convert.ToInt16(szSplitIP[0])));
                        writer.Write(Convert.ToByte(Convert.ToInt16(szSplitIP[1])));
                        writer.Write(Convert.ToByte(Convert.ToInt16(szSplitIP[2])));
                        writer.Write(Convert.ToByte(Convert.ToInt16(szSplitIP[3])));
                        writer.Write(Port);
                        writer.Write(packet_type);
                        if (bDebug) Console.Write("Передающий пакет '"/*Transmitting Packet*/ + packet_type + "'" + Environment.NewLine);
                        TransmitMS = DateTime.Now; // To get ping (ms to reach back & forth to the svr)
                    }
                }
                svrConnect.SendTo(stream.ToArray(), serverEndPoint);
            }
            catch (Exception e)
            {
                if (bDebug) Console.Write($"Не удалось получить пакет: {e}"); //Console.Write("Failed to receive packet:", e);
            }
        }
        catch (Exception e)
        {
            if (bDebug) Console.Write($"Не удалось подключиться к IP: {e}"); //Console.Write("Failed to connect to IP:", e);
        }
    }
    //------------------------------------------------------------------------------------------
    Dictionary<string, string> dData = new Dictionary<string, string>();
    public Dictionary<string, string> Read(bool flushdata = true)
    {
        try
        {
            serverIp = new IPAddress(IPAddress.Parse(IP).GetAddressBytes());
            serverEndPoint = new IPEndPoint(serverIp, Port);
            EndPoint rawPoint = serverEndPoint;
            byte[] szReceive = new byte[2048];
            svrConnect.ReceiveFrom(szReceive, ref rawPoint);
            svrConnect.Close();
            ReceiveMS = DateTime.Now;
            if (flushdata)
                dData.Clear();
            string ping = ReceiveMS.Subtract(TransmitMS).Milliseconds.ToString();
            MemoryStream stream = new MemoryStream(szReceive);
            BinaryReader read = new BinaryReader(stream, System.Text.Encoding.Default);
            using (stream)
            {
                using (read)
                {
                    read.ReadBytes(10);
                    switch (read.ReadChar())
                    {
                        case 'i':
                            dData.Add("password", Convert.ToString(read.ReadByte()));
                            dData.Add("players", Convert.ToString(read.ReadInt16()));
                            dData.Add("maxplayers", Convert.ToString(read.ReadInt16()));
                            dData.Add("hostname", new string(read.ReadChars(read.ReadInt32())));
                            dData.Add("gamemode", new string(read.ReadChars(read.ReadInt32())));
                            dData.Add("language", new string(read.ReadChars(read.ReadInt32())));
                            dData.Add("ping", ping.ToString());   //Дополнительный ключ для более удобного использования
                            break;
                        case 'r':
                            for (int i = 0, iRules = read.ReadInt16(); i < iRules; i++)
                                dData.Add(new string(read.ReadChars(read.ReadByte())), new string(read.ReadChars(read.ReadByte())));
                            break;
                        case 'c':
                            for (int i = 0, iPlayers = read.ReadInt16(); i < iPlayers; i++)
                                dData.Add(new string(read.ReadChars(read.ReadByte())), Convert.ToString(read.ReadInt32()));
                            break;
                        case 'd':
                            for (int i = 0, iTotalPlayers = read.ReadInt16(); i < iTotalPlayers; i++)
                            {
                                string id = Convert.ToString(read.ReadByte());
                                dData.Add(id + ".name", new string(read.ReadChars(read.ReadByte())));
                                dData.Add(id + ".score", Convert.ToString(read.ReadInt32()));
                                dData.Add(id + ".ping", Convert.ToString(read.ReadInt32()));
                            }
                            break;
                        case 'p':
                            dData.Add("ping", ping.ToString());
                            break;
                    }
                }
            }
        }
        catch (SocketException SockEx)
        {
            if (bDebug)
            Console.Write("Проблема с чтением данных ({0})" + Environment.NewLine/*There's been a problem reading the data*/, SockEx.ErrorCode);
        }
        return dData;
    }
  }
}

В чем может быть причина, что интернет зависает? Лишь через некоторое время от 2 до 5 минут, интернет опять начинает работать

READ ALSO
Binding лини и квадрата

Binding лини и квадрата

Имеется канва на которой я могу рисовать квадраты, а их соединять линиямиТакже я могу выделять эти квадраты и перетаскивать как захочу, и соответственно...

398
Переполнение типа данных в тесте Ферма на простоту

Переполнение типа данных в тесте Ферма на простоту

Добрый деньРеализовал вероятностный алгоритм определение простоты числа на основе малой теоремы Ферма

388
Сохранение и загрузка в файл List&lt;T&gt;Serialize Deserialize

Сохранение и загрузка в файл List<T>Serialize Deserialize

Хочу сохранять при закрытии формы данные в файл и потом загружатьПри сохранении все сохраняется, а при открытии не загружается

420
Как установить индекс текущей строки в datagridview?

Как установить индекс текущей строки в datagridview?

Программно выделяю строку в гриде:

637