connect(85, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr(«65.21.196.43»)}, 16) = -1 EINPROGRESS (Operation now in progress) poll([{fd=85, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout) poll([{fd=85, events=POLLOUT}], 1, 1000) = 0 (Timeout)

connect(85, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr("65.21.196.43")}, 16) = -1 EINPROGRESS (Operation now in progress) poll([{fd=85, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout) poll([{fd=85, events=POLLOUT}], 1, 1000) = 0 (Timeout)

Лог, представленный выше, показывает проблемы с сетевым соединением через сокет. Рассмотрим детали каждого сообщения:

  1. connect(85, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr("65.21.196.43")}, 16) = -1 EINPROGRESS (Operation now in progress)
    Эта строка указывает, что программа пытается установить не-блокирующее соединение с сервером по адресу 65.21.196.43 и порту 443 (стандартный порт HTTPS). Возвращённая ошибка EINPROGRESS означает, что операция ещё не завершена, что ожидаемо для не-блокирующего сокета.
  2. poll([{fd=85, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
    Здесь вызывается poll, чтобы проверить, можно ли писать в файловый дескриптор 85 (сокет). Таймаут установлен на 0, что означает немедленное завершение вызова. Результат 0 указывает, что сокет пока не готов для записи.
  3. Повторяющиеся вызовы poll с таймаутом в 1000 мс
    Последующие строки показывают многократные попытки ожидания готовности сокета с таймаутом в 1 секунду. Каждый раз результат 0 (Timeout) указывает, что сокет не становится доступным для записи в течение указанного времени. Это означает, что соединение не установлено.

Возможные причины проблемы

  1. Сетевая недоступность
    Сервер по адресу 65.21.196.43 может быть недоступен из-за сетевых проблем, таких как неправильно настроенный маршрутизатор, межсетевой экран (firewall) или сбои на стороне сервера.
  2. Блокировка порта или IP
    Межсетевой экран или политика безопасности могут блокировать доступ к порту 443 или указанному IP-адресу.
  3. Проблемы с DNS или маршрутизацией
    Хотя IP-адрес указан явно, проблемы на уровне маршрутизации могут привести к невозможности установить соединение.
  4. Сокет завис в не-блокирующем режиме
    Если сервер не отвечает вовремя, сокет остаётся в состоянии ожидания, что приводит к таймауту.

Что делать?

  1. Проверка доступности сервера
    Используйте команды вроде ping или traceroute, чтобы убедиться, что сервер доступен. Например:
    bash
    ping 65.21.196.43
    traceroute 65.21.196.43
  2. Проверка порта
    Используйте telnet или nc, чтобы проверить, открыт ли порт 443:
    bash
    telnet 65.21.196.43 443
    nc -zv 65.21.196.43 443
  3. Анализ сетевых правил
    Проверьте правила межсетевого экрана (локального или сетевого) и убедитесь, что IP-адрес и порт не блокируются.
  4. Логи сервера
    Если вы контролируете сервер, проверьте его логи для диагностики входящих подключений. Возможно, сервер отклоняет или игнорирует запросы.
  5. Увеличение таймаута
    Попробуйте увеличить таймаут в вызове poll, чтобы дать серверу больше времени на отклик. Если соединение устанавливается, но с задержкой, это может быть связано с нагрузкой на сервер.
  6. Диагностика на уровне приложения
    Проверьте, правильно ли настроен ваш код. Например, корректно ли установлен не-блокирующий режим для сокета и обрабатываются ли все ошибки.
  7. Проверка с помощью других инструментов
    Попробуйте использовать curl или аналогичный инструмент для соединения с сервером:
    bash
    curl -v https://65.21.196.43

Анализ по коду

Если код, работающий с сокетом, доступен, полезно проверить:

  • Установлен ли правильный таймаут.
  • Корректно ли выполняется переход сокета в не-блокирующий режим.
  • Обрабатываются ли события POLLERR, POLLHUP, POLLRDHUP, которые могут указывать на ошибки соединения.

Разрешение проблемы потребует пошагового подхода: проверки доступности сервера, настройки сетевого окружения и, возможно, исправления кода приложения.

Понравилась статья? Поделиться с друзьями:
Тех-Знаток
Добавить комментарий