|
![]() |
#1 |
Участник
|
Вот рабочий пример проверки соединения по определенному порту сервера, проверял на 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). |
![]() |
#2 |
Снова балуюсь косаптой :)
|
Цитата:
В том-то и дело, что для 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; } 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; }
__________________
Бесты и регарды! |
|
Теги |
firebird, ping |
|
|