Функция разрешения входящего соединения через сокет формирует дескриптор нового сокета, возвращая значение типа 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
уже не является прослушиваемым сокетом, как это должно следовать из названия.
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Я установил IDE NetBeans 82 и теперь стоит задача реализовать в приложении локальную базу
Задача: 1) создать множество cats; 2) в методе createCats() создать 3 кота и присвоить их множеству cats; 3) удалить одного кота из множества cats в методе...