2015-05-14 2 views
2

Я пишу программу C, чтобы проверить, реагирует ли удаленный хост на определенный порт (в моем случае приложение работает на 9090 с удаленной стороны). Первоначально я пробовал
nc -zv <host> <port> используя вызов функции system(), но не смог получить желаемый результат. Теперь я создал неблокирующий сокет и с помощью вызова connect(), чтобы проверить его. Но его возврат -1 и установка errno -115 (Выполняется операция) После поиска в Интернете у меня возникла идея использовать select() и poll(), но я не могу получить, как их реализовать. Любое предложение с образцом программы будет полезно.Как проверить, доступен ли удаленный хост на определенном порту в C?

ответ

4

Выполняйте именно то, что вы делаете, но в режиме блокировки.

Или еще, сделайте точно, что вы делаете, а затем добавьте сокет FD в набор записей и вызовите select(). Если FD отображается как записываемый, соединение преуспело.

Не забудьте закрыть розетку.

Но мне интересно, почему вы это делаете. Просто попробуйте подключиться к тому, что вам нужно подключиться, на данный момент вам нужно это сделать. Не пытайтесь предсказать, удастся ли это сделать.

+0

Есть ли способ указать время ожидания вызова connect(). Я имею в виду, что connect() будет пытаться на столько секунд в режиме блокировки – cbinder

+0

IIRC, тайм-аут connect() является общесистемным параметром для большинства ОС и предполагает, что одноранговый узел может находиться за тремя спутниковыми каналами и двумя модемами (т. Е. очень длинный:). –

+0

@cbinder Нет. Для этого вам нужно будет использовать 'select()'. Обратите внимание, что вы можете уменьшить время ожидания подключения к платформе, а не увеличивать ее. – EJP

1

Что я понимаю, вы будете делать только простую связь. Это следует сделать в режиме блокировки . Вот пример:

#include <netdb.h> 
#include <arpa/inet.h> 
#include <sys/un.h> 

in_addr_t in_build_addr(const char * p_server) 
{ 
    in_addr_t addr = inet_addr(p_server); 
    if(INADDR_NONE == addr) { 
    struct hostent * server_info = gethostbyname(p_server); 
    if(NULL == server_info) { 
     return 0; 
    } 
    memcpy(&addr, server_info->h_addr_list[0], server_info->h_length); 
    } 
    return addr; 
} 

int check_connect(const char * p_server, in_port_t p_port) { 
    int sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if(0 > sock) { 
    return -1; 
    } 
    struct sockaddr_in addr = { 
     .sin_family  = AF_INET, 
     .sin_port   = htons(p_port), 
     .sin_addr.s_addr = in_build_addr(p_server) 
    }; 
    if(0 != connect(sock, (struct sockaddr *)&addr, sizeof(addr))) { 
    close(sock); 
    return -2; 
    } 
    close(sock); 
    return 0; 
} 

Вы можете попробовать использовать функцию _check_connect_. Эта функция подключается к определенному серверу (ip или имя) и порту и немедленно закрывает сокет.

Смежные вопросы