Я пытаюсь динамически назначить номер порта клиенту, и поэтому я реализовал следующий метод внутри класса соединения:
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()
, вызываемая внутри другого метода, возвращает ошибку).В связи с этим я задам вам вопрос:
- Это нормальное поведение функции
bind()
? - Если да, это происходит потому, что сокеты связаны только с процессами (другими словами, у каждого процесса есть свои собственные сокеты), а порты связаны с сетевым интерфейсом?
- Если да, как я могу динамически назначать значения портов внутри диапазона, не создавая конфликтов с другими процессами?
- Является ли присвоение
0
clieParams.sin_port
единственным доступным решением этой проблемы?