getaddrinfo bind: адрес уже используется - PullRequest
0 голосов
/ 07 января 2020

Всякий раз, когда я пытаюсь запустить свое приложение на macOS Catalina 10.15.2 (19C57) или Linux 5.4.3-arch1-1 x86_64 GNU / Linux, я получаю:

_rSockd: bind: Address already in use
libc++abi.dylib: terminating with uncaught exception of type std::runtime_error: failed to bind to socket
[1]    31181 abort      Saol/saol

сейчас Я проверил открытые порты с sudo netstat -tulp udp и sudo lsof -i udp, но ни один из них не сообщает ни о каких моих приложениях, использующих эти порты. В данный момент ничего не прослушивает порт (45100).

Я просмотрел несколько похожих постов, в которых упоминалось добавление SO_REUSEADDR, но это ничего не изменило, когда он у меня есть или когда у меня его нет. В сообщениях также упоминалось о проверке чего-либо с использованием порта, но я не смог (я полагаю, если только вышеприведенные команды не были использованы неправильно), чтобы найти мои порты заблокированными. Я пробовал несколько разных портов (в настоящее время используется 45100); _port var устанавливается на int до вызова функции _Init. Второй аргумент getaddrinfo - это const char *service, и он указан на страницах руководства:

служба устанавливает порт в каждой возвращаемой структуре адресов. Если этот аргумент является именем службы (см. Services (5)), он преобразуется в соответствующий номер порта. Этот аргумент также может быть указан как десятичное число, которое просто преобразуется в двоичный. Если служба NULL, то номер порта возвращенных адресов сокетов останется неинициализированным. Если AI_NUMERICSERV указан в hints.ai_flags и служба не равна NULL, тогда служба должна указывать на строку, содержащую цифру c номер порта. Этот флаг используется для запрета вызова службы разрешения имен в тех случаях, когда известно, что она не требуется.

Все, что я делаю с _port, это: int -> string -> char *

Ниже приведен соответствующий раздел моего кода:

#include <iostream>

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>

#define PORT "45100"

auto main(void) -> int {
  int rv;
  int _rSockd;
  const char * port = std::to_string(8080).c_str();

  struct addrinfo hints;
  struct addrinfo *servinfo;
  struct addrinfo *p;

  memset(&hints, 0, sizeof hints);
  hints.ai_family = AF_UNSPEC;
  hints.ai_socktype = SOCK_DGRAM;
  hints.ai_flags = AI_PASSIVE;
  if((rv = getaddrinfo(NULL, port, &hints, &servinfo)) != 0) {
    std::cerr << "getaddrinfo: " << std::endl << gai_strerror(rv) << std::endl;
    throw std::runtime_error("failed to getaddrinfo");
  }

  for(p = servinfo; p != NULL; p = p->ai_next) {
    if((_rSockd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
      std::perror("_rSockd: socket");
      close(_rSockd);
      continue;
    }

    if(bind(_rSockd, p->ai_addr, p->ai_addrlen) == -1) {
      close(_rSockd);
      std::perror("_rSockd: bind");
      continue;
    }

    break;
  }

  if(p == NULL) {
    throw std::runtime_error("failed to bind to socket");
  }

  freeaddrinfo(servinfo);

  return 0;
}

Буду признателен за любую помощь; Я чувствую, что смотрю на него слишком долго и что-то упускаю из виду c.

ПРИМЕЧАНИЕ: Когда я добавил MCVE (приведенный выше обновленный код), у меня больше нет моего проблема при работе с портами 8080 и 45100. Поэтому я сейчас объясню Теперь проверьте, не вызывает ли это проблему.

ОБНОВЛЕНИЕ

Когда я сделал MCVE, все заработало. У него никогда не было проблем с моей базой проекта. Мой проект - это библиотека, вызываемая из другого исполняемого проекта. libSaol имеет сетевой код, saol - исполняемый файл, который связывает libSaol.

Если честно, меня это смущает больше ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...