Динамически назначать номер порта в диапазоне значений - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь динамически назначить номер порта клиенту, и поэтому я реализовал следующий метод внутри класса соединения:

void TCPConnection::bindSocket() {
  short result;
  clieParams.sin_family = AF_INET;
  for (unsigned short port = MIN_PORT_NUMBER; port < MAX_PORT_NUMBER; port++) {
    clieParams.sin_port = htons(port);
    result = bind(socketFD, (const struct sockaddr*) &clieParams, sizeof clieParams);
    printf("%i\t", result);
    if (!(result < 0)) {
#ifdef DEBUG
      std::cout << "[DEBUG] Socket bound with port " << port << "..." << std::endl;
#endif
      break;
    }
  }
  if (result < 0) {
    throw TCPConnectionException("Socket bind failed.");
  }

Запуская этот класс в разных процессах, вышеуказанный метод всегда связываетсокет на том же порту, несмотря на то, что он уже назначен и используется другими процессами (функция connect(), вызываемая внутри другого метода, возвращает ошибку).В связи с этим я задам вам вопрос:

  1. Это нормальное поведение функции bind()?
  2. Если да, это происходит потому, что сокеты связаны только с процессами (другими словами, у каждого процесса есть свои собственные сокеты), а порты связаны с сетевым интерфейсом?
  3. Если да, как я могу динамически назначать значения портов внутри диапазона, не создавая конфликтов с другими процессами?
  4. Является ли присвоение 0 clieParams.sin_port единственным доступным решением этой проблемы?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...