Я пишу программу C, чтобы проверить, реагирует ли удаленный хост на определенный порт (в моем случае приложение работает на 9090 с удаленной стороны). Первоначально я пробовал
nc -zv <host> <port>
используя вызов функции system(), но не смог получить желаемый результат. Теперь я создал неблокирующий сокет и с помощью вызова connect(), чтобы проверить его. Но его возврат -1 и установка errno -115 (Выполняется операция) После поиска в Интернете у меня возникла идея использовать select()
и poll()
, но я не могу получить, как их реализовать. Любое предложение с образцом программы будет полезно.Как проверить, доступен ли удаленный хост на определенном порту в C?
2
A
ответ
4
Выполняйте именно то, что вы делаете, но в режиме блокировки.
Или еще, сделайте точно, что вы делаете, а затем добавьте сокет FD в набор записей и вызовите select().
Если FD отображается как записываемый, соединение преуспело.
Не забудьте закрыть розетку.
Но мне интересно, почему вы это делаете. Просто попробуйте подключиться к тому, что вам нужно подключиться, на данный момент вам нужно это сделать. Не пытайтесь предсказать, удастся ли это сделать.
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 или имя) и порту и немедленно закрывает сокет.
Смежные вопросы
- 1. Как проверить, доступен ли удаленный компьютер?
- 2. Android Проверьте, доступен ли WebService на порту
- 3. Как проверить процесс, выполняющийся на определенном порту в NSIS
- 4. Самый быстрый способ понять, доступен ли удаленный хост
- 5. Как проверить, доступен ли порт
- 6. C# проверить, доступен ли файл
- 7. C++, как проверить, доступен ли поток (iostream)
- 8. убивает процесс на определенном порту
- 9. Есть ли способ проверить, есть ли хост?
- 10. Как проверить, доступен ли DirectX?
- 11. Запуск проекта RC2 на определенном порту
- 12. Как проверить, если хост доступен по локальной сети с PHP
- 13. Как проверить, недоступен ли хост?
- 14. Как проверить, доступен ли CLLocationCoordinate2DIsValid?
- 15. Как проверить, доступен ли GPRS
- 16. Как проверить, доступен ли модуль для импорта?
- 17. Как проверить, доступен ли UIKeyboardTypeDecimalPad?
- 18. Проверить доступность безопасного подключения на пользовательском порту на iPhone?
- 19. Как проверить, доступен ли scp?
- 20. Как проверить, доступен ли currentDocument
- 21. Как проверить, подключен ли клиент к другому порту в C#
- 22. Как проверить, доступен ли MediaRecorder.AudioSource.VOICE_CALL?
- 23. проверить, доступен ли сервер?
- 24. nodejs - Как проверить, открыт ли удаленный сокет?
- 25. C++: Как проверить удаленный указатель
- 26. Развертывание приложения на wildfly на определенном порту
- 27. Удаленный хост iframe
- 28. Как проверить, если ресурс доступен в C#
- 29. UnknownHostException Когда хост доступен.
- 30. Как проверить, могу ли я получить удаленный сервер на конкретном порту
Есть ли способ указать время ожидания вызова connect(). Я имею в виду, что connect() будет пытаться на столько секунд в режиме блокировки – cbinder
IIRC, тайм-аут connect() является общесистемным параметром для большинства ОС и предполагает, что одноранговый узел может находиться за тремя спутниковыми каналами и двумя модемами (т. Е. очень длинный:). –
@cbinder Нет. Для этого вам нужно будет использовать 'select()'. Обратите внимание, что вы можете уменьшить время ожидания подключения к платформе, а не увеличивать ее. – EJP