Показать сообщение отдельно
  #1  
Старый 22.05.2009, 16:47
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
Вопрос ping + проверка порта на открытость

Сразу предупреждаю: яндексил, поиск по форуму юзал.

Нужен простой алгоритм ping-а (без применения тяжеловесов-индейцев, всё на winsock), и если есть ответ от сервера - проверить, открыт ли на нём порт. В результате функция должна вернуть:
-1 - если сервер недоступен
-2 - если сервер доступен, но порт закрыт
иначе среднее из двух-трёх пингов.

То, что имею сейчас:
Код:
function Aviable(ipaddr:string;port:integer):boolean;
var
  D:WSAData;
  S:TSocket;
  A:TSockAddr;
begin
  result:=false;
  if WSAStartup($101,D)<>0 then exit;
  A.sin_family:=AF_INET;
  A.sin_addr.S_addr:=inet_addr(pchar(ipaddr));
  S:=socket(AF_INET,SOCK_STREAM,0);
  if S=INVALID_SOCKET then exit;
  A.sin_port:=htons(port);
  if connect(S,A,sizeof(A))=0 then result:=true;
  WSACleanup;
end;
выдрал из ДелфиВорлда. Но он "застревает", если нету соединения с портом. Если есть метод поставить на нето таймаут - буду признателен. Если доделаю эту с таймаутом, то пинг возможно и сам сумею встроить... Но лучше бы сразу функцию...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj