AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.02.2012, 12:03   #1  
ice321i is offline
ice321i
Участник
 
63 / 54 (2) ++++
Регистрация: 22.10.2007
Вот рабочий пример проверки соединения по определенному порту сервера, проверял на 5, должно работать и для 4:
X++:
static void ConnectToServer(Args _args)
{
    System.Net.Sockets.TcpClient tcpClient;
    ;

    tcpClient = new System.Net.Sockets.TcpClient();
    
    try
    {
        tcpClient.Connect('www.yandex.ru', 80);

        if(tcpClient.get_Connected())
        {
            info("Сервер доступен");
            tcpClient.Close();
        }
    }
    catch(Exception::CLRError)
    {
        error("Ошибка при подключении к серверу");
    }
}
За это сообщение автора поблагодарили: CHESER85 (1).
Старый 10.07.2013, 17:59   #2  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
Цитата:
Сообщение от ice321i Посмотреть сообщение
Вот рабочий пример проверки соединения по определенному порту сервера, проверял на 5, должно работать и для 4:
X++:
static void ConnectToServer(Args _args)
{
    System.Net.Sockets.TcpClient tcpClient;
    ;

    tcpClient = new System.Net.Sockets.TcpClient();
...
}

В том-то и дело, что для 4-ки работает хреново
Иногда вылетает с эксепшеном, иногда без эксепшена - просто не доходит до конца кода.
И еще, помимо вылетов, важный недостаток - нельзя настроить таймаут, который определяет, сколько надо ждать ответа от удаленного сервера, перед тем как посчитать его недоступным.
Я нашел в сети простую утилитку, которая работает для серверов как внутри сети (за фаерволлом), так и вне ее. Работает примитивно, но зато надежно.
Использую прежде всего для определения доступности удаленного (связанного) SQL-сервера, по порту 1433.
Таймаут определен в три секунды, можно поставить и меньше.
Утилитку надо положить в каталог Include приложения.

X++:
#define.PingSuccess('1 successful, 0 failed')
#define.PingFailed('0 successful, 1 failed')
#WInAPI
static server boolean ping3(ServerName _ServerName, str 10 _port = '80')
{
    boolean res, xSuccess, xFailed;

//  одна секунда ожидания
    str templateStr = '-4 -n 1 -w 1 %1 %2 > %3';
    str paramStr, outputStr, commandStr;
    fileName xTCPingEXE;
    fileName xFileName, xDir;
    TextBuffer TextBuffer = new TextBuffer();
    Counter i;

    ;
    xDir = WinAPIServer::getTCPing(true);

    xTCPingEXE = WinAPIServer::getTCPing(false);
    xFileName = xDir + curUserId() + '_ping.txt';
    paramStr = strFmt(templateStr, _ServerName, _port, xFileName);
    commandStr = 'CMD /c ' + xTCPingEXE + ' ' + paramStr;

//  три секунды ожидания
    WinAPI_R::shellExecuteWait(commandStr, 3000);
    TextBuffer.fromFile(xFileName);
    outputStr = TextBuffer.getText();
    xSuccess = strscan(outputStr, #PingSuccess, 1, strlen(outputStr)) ? true : false;
    xFailed = strscan(outputStr, #PingFailed, 1, strlen(outputStr)) ? true : false;
    if (xSuccess == xFailed)
    {
        throw error("Непонятный результат пинга!");
    }

    WinAPIServer::deleteFile(xFileName);
    return xSuccess;
}
Метод, возвращающий (серверный) путь к экзешнику tcping.exe:
X++:
static server fileName getTCPing(boolean _directoryOnly = false)
{
    filename xdir, xfile;

    ;

    xdir = xInfo::directory(DirectoryType::Include) + @'TCPing\';
    xfile = xInfo::directory(DirectoryType::Include) + @'TCPing\tcping.exe';
    if (!WinAPIServer::fileExists(xfile))
    {
        throw info(strFmt('   %1', xfile));
    }
    return _directoryOnly ? xdir : xfile;
}
метод shellExecuteWait() взят отсюда.
__________________
Бесты и регарды!
Теги
firebird, ping

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Метод "open" в COM-объекте класса "ADODB.Connection" возвратил код ошибки 0x80004005 (E_FAIL) Poleax DAX: Программирование 14 01.10.2013 14:15
Как программно узнать текущий объект и метод в котором выполняется код? McCoy DAX: Программирование 15 25.02.2011 23:34
Dundas.mailer-код ошибки 0x80020009 donMigel DAX: Прочие вопросы 4 06.10.2010 10:28
Метод "SendMail" в COM-объекте класса "Dundas.mailer" возвратил код ошибки 0x80004005 (E_FAIL), который означает: The RCPT command failed. The specified account does not exist. Андрей К. DAX: Программирование 3 10.07.2009 16:08
Метод 'SendMail' в COM-объекте класса 'Dundas.mailer' возвратил код ошибки 0x80004005 (E_FAIL), который означает: The HELLO command failed. Andrew Akhmetov DAX: Программирование 4 09.04.2008 13:24

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:35.