Функция разрешения входящего соединения через сокет формирует дескриптор нового сокета, возвращая значение типа SOCKET.
В документации Microsoft приведён следующий пример использования функции:
// Изначальное объявление и определение сокетов
SOCKET ListenSocket = INVALID_SOCKET;
SOCKET ClientSocket = INVALID_SOCKET;
// Некоторый код...
// ListenSocket в состоянии прослушивания( listen() )
ClientSocket = accept(ListenSocket, NULL, NULL);
// Далее
closesocket(ListenSocket);
Вопрос: будет ли корректно написать (можно ли вообще)
ListenSocket = accept(ListenSocket, NULL, NULL);
для избавления от дополнительного сокета, так как (в примере от Microsoft) после вызова данной функции сокет прослушивания закрывается?
будет ли корректно написать (можно ли вообще)
ListenSocket = accept(ListenSocket, NULL, NULL);
Так писать можно (с точки зрения языка), но ошибочно с точки зрения утекания ресурсов. После подобной записи значение ListenSocket затирается и уже не получится закрыть прослушиваемый сокет, если конечно заранее не сохранить это значение куда-то ещё, например:
auto oldListenSocket = ListenSocket;
ListenSocket = accept(ListenSocket, NULL, NULL);
// ...
close(oldListenSocket);
Но приведёт это всё к тому же, с чего и начинали, только с более мутными названиями переменных.
В общем случае, не стоит переиспользовать одну и ту же переменную для разных целей, даже если она уже не используется и не нужна. А в упомянутом случае помимо того, что она всё ещё нужна (чтобы закрыть сокет), использование той же самой переменной ломает самодокументирование программы, т.к. ListenSocket уже не является прослушиваемым сокетом, как это должно следовать из названия.
Продвижение своими сайтами как стратегия роста и независимости