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