Как изменить порт прослушивания сокета после вызова accept()?

Я хотел бы изменить порт, который слушает сокет. Проблема в том, что я не могу сделать это, пока продолжается вызов accept (). Я попытался закрыть сокет, ожидая, что accept () завершит работу и вернет отрицательное значение. Но это не происходит на FreeRTOS. Когда я закрываю сокет из другого потока, accept () по-прежнему выполняется. Единственный обходной путь, который я нашел, - установить флаг в переменной, установить TCP-соединение, а затем, когда accept () завершится, проверить флаг, bind() с новым портом и вызовом listen (). Но, может быть, есть более элегантный метод?

1 ответ

Я хотел бы изменить порт, который слушает сокет.

Ты не можешь Вы должны закрыть текущий сокет прослушивания, а затем открыть новый сокет прослушивания.

Проблема в том, что я не могу сделать это, пока продолжается вызов accept().

Вы должны разблокировать accept() Сначала вы можете закрыть гнездо для прослушивания.

Я пытался закрыть сокет

Это правильный способ реализации требования, но он не означает изменение порта, который прослушивает сокет. Вы должны создать новый сокет, прослушивающий новый порт.

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

Это странное требование. Какова цель?

Другие вопросы по тегам