WinSock2 - функция accept()

127
06 декабря 2019, 18:50

Функция разрешения входящего соединения через сокет формирует дескриптор нового сокета, возвращая значение типа 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) после вызова данной функции сокет прослушивания закрывается?

Answer 1

будет ли корректно написать (можно ли вообще)

ListenSocket = accept(ListenSocket, NULL, NULL);

Так писать можно (с точки зрения языка), но ошибочно с точки зрения утекания ресурсов. После подобной записи значение ListenSocket затирается и уже не получится закрыть прослушиваемый сокет, если конечно заранее не сохранить это значение куда-то ещё, например:

auto oldListenSocket = ListenSocket;
ListenSocket = accept(ListenSocket, NULL, NULL);
// ...
close(oldListenSocket);

Но приведёт это всё к тому же, с чего и начинали, только с более мутными названиями переменных.

В общем случае, не стоит переиспользовать одну и ту же переменную для разных целей, даже если она уже не используется и не нужна. А в упомянутом случае помимо того, что она всё ещё нужна (чтобы закрыть сокет), использование той же самой переменной ломает самодокументирование программы, т.к. ListenSocket уже не является прослушиваемым сокетом, как это должно следовать из названия.

READ ALSO
Как изменить размер JButton в Java

Как изменить размер JButton в Java

что делать? Я попробовал все методы/ или же большую часть

121
Как подключить локальную базу данных в NetBeans 8.2

Как подключить локальную базу данных в NetBeans 8.2

Я установил IDE NetBeans 82 и теперь стоит задача реализовать в приложении локальную базу

131
iterator().next()

iterator().next()

Задача: 1) создать множество cats; 2) в методе createCats() создать 3 кота и присвоить их множеству cats; 3) удалить одного кота из множества cats в методе...

145