Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.88/33: Рейтинг темы: голосов - 33, средняя оценка - 4.88
Ilnur888
2 / 2 / 0
Регистрация: 18.01.2012
Сообщений: 163
1

Отследить доступность сервера

19.07.2012, 11:21. Просмотров 6290. Ответов 20
Метки нет (Все метки)

имеется сервер, так создается в нем сокет
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        private void SetupServerSocket()
        {
            _port = 5321;
            IPHostEntry localMachineInfo = Dns.Resolve("192.168.16.127");
               // Dns.GetHostEntry(Dns.GetHostName());
            IPEndPoint myEndpoint = new IPEndPoint(
               localMachineInfo.AddressList[0], _port);
 
            // Создаем сокет, привязываем его к адресу
            // и начинаем прослушивание
            _serverSocket = new Socket(myEndpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            _serverSocket.Bind(myEndpoint);
            _serverSocket.Listen((int)SocketOptionName.MaxConnections);
        }
имеется клиент который в отдельном потоке отслеживает доступность сервака вот код процедуры которая занимается отслеживанием:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
       
        public void ConnectThread()
        {
            while (true)
            {
                _availability = getCon();
                System.Threading.Thread.Sleep(100);
            }
        }
...
private bool getCon()
        {
            
            try
            {
                //Устанавливаем удаленную конечную точку для сокета
                IPHostEntry ipHost = Dns.Resolve(this.IP);
                    //Dns.GetHostEntry(Dns.GetHostName());
                IPAddress ipAddr = ipHost.AddressList[0];
                IPEndPoint ipEndPoint1 = new IPEndPoint(ipAddr, this.Port);
 
                _connSearchSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                _connSearchSocket.Connect(ipEndPoint1);
                _connSearchSocket.Shutdown(SocketShutdown.Both);
                _connSearchSocket.Close();
                return true;
            }
            catch
            {
                //_connSearchSocket.Shutdown(SocketShutdown.Both);
                _connSearchSocket.Close();
                return false;
            }
        }
если запустить и клиент и сервер на одной и той же машине, то все прекрасно работает, а вот если запустить сервер на другой машине то клиент не может отследить доступность сервера (((
почему так??? может есть какие нибудь другие идеи по отслеживанию доступности сервера, по IP и номеру порта ???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.07.2012, 11:21
Ответы с готовыми решениями:

Доступность переменной
class Discount { public int id; public int priority; ...

Доступность переменных
Сразу прошу прошения за столь нубский вопрос, но все же... у меня есть...

Ошибка: несовместимые доступность
Есть следующий метод: public void AddCredit(CreditEnter ob) { ...

Проверить доступность сайта
Нужно отправить post запрос на сайт, но он бывает выдает 500, 522 и подобные...

Проверка сайта на доступность
Подскажите как проверить сайт на доступность вот допустим есть сайт vk.com если...

20
PingWiN0x20
55 / 55 / 8
Регистрация: 13.05.2010
Сообщений: 105
19.07.2012, 11:42 2
Есть идея отключить на компах брандмауэр
0
Ilnur888
2 / 2 / 0
Регистрация: 18.01.2012
Сообщений: 163
19.07.2012, 11:50  [ТС] 3
и что это даст??? я на компе сервака открыл доступ к указанному порту... не пойму я что то, а почему если на одной и той же машине то работает???
0
PingWiN0x20
55 / 55 / 8
Регистрация: 13.05.2010
Сообщений: 105
19.07.2012, 12:20 4
Это даст уверенность, что блокирует сигнал не фаерволл.
Если при отключенных фаерволах все работает, значит дело в них. Если нет - можно дальше разбираться.
Попробуйте пингануть сервер штатными средствами (ping 192.168.16.127).
И к чему вообще изобретать велосипед, если есть http://msdn.microsoft.com/ru-ru/libr...tion.ping.aspx
0
Ilnur888
2 / 2 / 0
Регистрация: 18.01.2012
Сообщений: 163
19.07.2012, 12:23  [ТС] 5
пинг проверяет доступность самой машины, а мне нужно ещё и порт проверить ...
0
Yukikaze
341 / 320 / 48
Регистрация: 12.12.2011
Сообщений: 563
19.07.2012, 12:23 6
Сервер с клиентской машины пингуется?
0
Ilnur888
2 / 2 / 0
Регистрация: 18.01.2012
Сообщений: 163
19.07.2012, 12:25  [ТС] 7
Цитата Сообщение от Yukikaze Посмотреть сообщение
Сервер с клиентской машины пингуется?
да пинг проходит нормально
0
Yukikaze
341 / 320 / 48
Регистрация: 12.12.2011
Сообщений: 563
19.07.2012, 12:29 8
Ilnur888, пингуется на внешний IP или внутренний?

ЗЫ
C#
1
2
3
IPHostEntry ipHost = Dns.Resolve("192.168.16.127");
IPAddress ipAddr = ipHost.AddressList[0];
ipEndPoint = new IPEndPoint(ipAddr, 5321);
можно заменить на 1 строку
C#
1
ipEndPoint = new IPEndPoint(IPAdress.Loopback, 5321);
0
Ilnur888
2 / 2 / 0
Регистрация: 18.01.2012
Сообщений: 163
19.07.2012, 12:32  [ТС] 9
блин ну на тот к которому сокет привязывается уж, скорее всего на внешний ... а сокет надо к какому привязывать???
0
Yukikaze
341 / 320 / 48
Регистрация: 12.12.2011
Сообщений: 563
19.07.2012, 12:35 10
Так понятно, будем разбираться потихоньку.
Для начала, какой IP пингуете с клиентского компа?
0
Ilnur888
2 / 2 / 0
Регистрация: 18.01.2012
Сообщений: 163
19.07.2012, 12:37  [ТС] 11
Цитата Сообщение от Yukikaze Посмотреть сообщение
Для начала, какой IP пингуете с клиентского компа?
вот этот 192.168.16.127
и к нему же я и сокет сервака привязывал
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void SetupServerSocket()
        {
            _port = 5321;
            IPHostEntry localMachineInfo = Dns.Resolve("192.168.16.127");
               // Dns.GetHostEntry(Dns.GetHostName());
            IPEndPoint myEndpoint = new IPEndPoint(
               localMachineInfo.AddressList[0], _port);
 
            // Создаем сокет, привязываем его к адресу
            // и начинаем прослушивание
            _serverSocket = new Socket(myEndpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            _serverSocket.Bind(myEndpoint);
            _serverSocket.Listen((int)SocketOptionName.MaxConnections);
        }
0
Yukikaze
341 / 320 / 48
Регистрация: 12.12.2011
Сообщений: 563
19.07.2012, 13:11 12
клиент
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    class Program
    {
        static void Main(string[] args)
        {
            const int Port = 12345;
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            client.BeginConnect(IPAddress.Parse("192.168.16.127"), 12345, ClientConnect, client); // Коннектимся по внутреннему, локальному IP
 
        }
 
        private static void ClientConnect(IAsyncResult ar)
        {
            Console.WriteLine("Connected");
        }
    }
сервер

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Server
    {
        static public void Main(string[] args)
        {
            const int Port = 12345;
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            server.Bind(new IPEndPoint(IPAddress.Any, Port)); // Ждем соединения от любого IP
            server.Listen(100);
            server.BeginAccept(AcceptClient, server);
            Console.WriteLine("Press any key...");
            Console.ReadKey(true);
        }
 
        private static void AcceptClient(IAsyncResult ar)
        {
            Socket client = (Socket)ar.AsyncState;
            client.BeginAccept(AcceptClient, client);
            Console.WriteLine("Client accepted");
        }
    }
1
Ilnur888
2 / 2 / 0
Регистрация: 18.01.2012
Сообщений: 163
19.07.2012, 13:37  [ТС] 13
спасибо, классно!!! а как сделать так чтобы клиент постоянно отслеживал доступность сервера, и как сделать так чтобы он отследил и то что сервер отключился тоже, и также в момент отключения сервера выполнил какой нить метод?
0
Yukikaze
341 / 320 / 48
Регистрация: 12.12.2011
Сообщений: 563
19.07.2012, 14:24 14
Цитата Сообщение от Ilnur888 Посмотреть сообщение
отследил и то что сервер отключился тоже, и также в момент отключения сервера выполнил какой нить мето
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    class Program
    {
        static byte[] buffer = new byte[512];
        static void Main(string[] args)
        {
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            client.BeginConnect(IPAddress.Parse("192.168.0.100"), 12345, ClientConnect, client);
            Console.ReadKey();
        }
 
        private static void ClientConnect(IAsyncResult ar)
        {
            Console.WriteLine("Connected");
            Socket client = (Socket)ar.AsyncState;
            int received;
            try
            {
                while ((received = client.Receive(buffer)) > 0)
                {
                    /*
                     * Получаем данные пока сервер не отвалится
                     * Если сервер отвалится, клиент получит пакет длинной 0 байт и цикл завершится
                     */
                }
            }
            catch (SocketException ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                client.Close();
                client.Dispose();
            }
            Console.WriteLine("Client disconnected"); //Выполянется какойнибудь метод
        }
    }
0
Ilnur888
2 / 2 / 0
Регистрация: 18.01.2012
Сообщений: 163
19.07.2012, 14:36  [ТС] 15
ага, понятно. а если я буду обмениваться с серваком данными через другой сокет (это в основном потоке программы), то этот сокет случайно не перехватит данные которые должен получить тот сокет???
0
Yukikaze
341 / 320 / 48
Регистрация: 12.12.2011
Сообщений: 563
19.07.2012, 14:40 16
Ilnur888, а теперь объясните, зачем вам 2 одинаковых потока? Со всеми вами изложенными задачами справляется один сокет.
Сокет будет принимать до тех пор пока:
а. вы сами не разорвете соединение
б. не вылетит исключение
с. не отключится сервер
0
Ilnur888
2 / 2 / 0
Регистрация: 18.01.2012
Сообщений: 163
19.07.2012, 14:43  [ТС] 17
я просто не хочу все переписывать, мне нужно было всего лишь одно булево свойство клиента, которое говорило бы в любой момент времени доступен сервер или нет, понимаете?
0
Yukikaze
341 / 320 / 48
Регистрация: 12.12.2011
Сообщений: 563
19.07.2012, 14:52 18
Ilnur888, вы понимаете, что если работает основной поток значит работает и любой другой, это значит вы свойству присвоили истину сразу после подключения, а после получения пакета длинной 0 байт установили ложь, зачем здесь второй поток?
Можете использовать такой метод для проверки
C#
1
2
3
4
5
6
7
8
9
10
11
static class SocketExtensions
{
  public static bool IsConnected(this Socket socket)
  {
    try
    {
      return !(socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0);
    }
    catch (SocketException) { return false; }
  }
}
ЗЫ Вы наплодили одинаковых тем, и везде я отвечаю одно и то же.
0
Ilnur888
2 / 2 / 0
Регистрация: 18.01.2012
Сообщений: 163
19.07.2012, 15:01  [ТС] 19
блин но если это делать в основном потоке то окно программы зависнет разве нет??? у меня не консольное приложение... программа должна отслеживать доступность сервера и выводить юзеру не кую информацию в зависимости от того доступен сервер или нет ... понимаете?
0
Yukikaze
341 / 320 / 48
Регистрация: 12.12.2011
Сообщений: 563
19.07.2012, 15:03 20
Ilnur888, начнем с того, что асинхронные сокеты по дефолту в другом потоке и вы совсем не понимаете принципов работы
0
19.07.2012, 15:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2012, 15:03

Доступность полей и методов в классе
Расскажите , пожалуйста , про доступ к полям методам и свойствам в классе....

Проверка HTML страницы на доступность
Здравствуйте! Подскажите как сделать проверку на доступность страницы? ...

Как проверить IP на работоспособность или доступность?
Подскажите как проверить введенный ип на работоспособность или доступность...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru