Закрытие параллельного серверного сокета (TCP) - PullRequest
0 голосов
/ 29 мая 2020

Я создаю параллельную серверную / клиентскую программу в C, используя потоки. Каждый раз, когда клиент подключается, я создаю новый поток для его обработки.

Моя проблема: я хочу иметь возможность закрыть сервер от клиента. Например, с помощью команды "..". Когда я набираю ".." в клиенте, я хочу, чтобы сервер немедленно закрылся.

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

Есть идеи, как решить эту проблему?

Спасибо!

1 Ответ

0 голосов
/ 30 мая 2020

Используйте select() или (e)poll() или эквивалент, чтобы дождаться подключения клиента, ПРЕЖДЕ, чем вы позвоните accept(), чтобы принять подключение. Такие функции позволяют вам указать тайм-аут, который позволит вам прекратить периодическое ожидание для проверки других условий, таких как запрос на отключение. На некоторых платформах вы можете даже заставить эти функции ждать не только прослушивающего сокета, но и отдельного канала, который вы создаете для себя лично, и когда вы хотите «разбудить» свое ожидание l oop, чтобы что-то сделать, просто напишите байт в этот канал, и когда l oop обнаруживает, что этот байт прибывает, он может действовать соответствующим образом.

...