WSAS запуск с RAII

  1. RAII не выполняет деструктор при вызове exit.Так WSACleanupне работает. В чем проблема? Я нашел libnet использование WSAStartupбез всяких WSACleanup, Зачем?
  2. WSAStartup можно вызывать много раз в одном процессе, так как можно обеспечитьWSACleanup довольно?
  3. Как пользоваться WSAStartup а также WSACleanup легко и элегантно?
  4. Дополнительно я написал этот тестовый код для теста WSAStartup безWSAClean, не обнаружил каких-либо ненормальных (рост памяти или сбой...)

код:

int main(int argc, char *argv[])
{
    int res;

    while (1) {
        WSADATA wsadata;
        res = WSAStartup(0x0202, &wsadata);
        printf("WSAStartup 1 times:%d\n", res);

        if (res != 0) {
            printf("WSAStartup error:%d\n", WSAGetLastError());
            exit(1);
        }

        res = WSAStartup(0x0202, &wsadata);
        printf("WSAStartup 2 times:%d\n", res);

        if (res != 0) {
            printf("WSAStartup error:%d\n", WSAGetLastError());
            exit(1);
        }
    }

    return 0;
}

3 ответа

1) exit() это проблема для всех вещей RAII, а не только для сокетов. Открытые файлы, память... Правильное решение состоит в том, чтобы избежать exit(),

2+3) Звоните как можно больше WSACleanup как WSAStartup, Я предполагаю, что вы хотите написать класс сокетов с одним соединением на объект, просто вызовите WSAStartup в конструкторе и WSACleanup в деструкторе.
Оба метода используют счетчик вызовов внутри, они обрабатывают несколько вызовов без проблем.

По моему мнению, exit уничтожит объект только тогда, когда объект размещен в стеке, статическом или глобальном. Он не должен быть выделен с помощью new, В случае newОбъект должен быть явно удален.

Хорошей практикой является то, что WSAStartup должен быть вызван при запуске приложения и WSACleanup когда приложение заканчивается. Таким образом, вы можете определить класс, который выполняет эту работу в своем конструкторе и деструкторе, и определить глобальный объект этого класса. Этот класс позаботится об этом.

У вас должна быть веская причина для инициализации WinSock несколько раз. В противном случае, выполните инициализацию только один раз, что вы можете сделать легко.

Согласно документу MS -

Приложение может вызывать WSAStartup более одного раза, если ему требуется получить информацию о структуре WSADATA более одного раза. При каждом таком вызове приложение может указать любой номер версии, поддерживаемый Winsock DLL.

...

Приложение должно вызывать функцию WSACleanup каждый раз, когда успешно вызывается функция WSAStartup. Это означает, например, что если приложение трижды вызывает WSAStartup, оно должно трижды вызывать WSACleanup. Первые два вызова WSACleanup ничего не делают, кроме уменьшения внутреннего счетчика; последний вызов WSACleanup для задачи освобождает все необходимые ресурсы для задачи.

Так что нормально (и рекомендуется) звонить WSACleanup столько раз, сколько вы звонили WSAStartup, который, в свою очередь, получает данные только из WSADATA на каждый звонок, кроме первого.

RAII не выполняет деструктор при вызове exit. Так что WSACleanup не запускается. В чем проблема?

IME, нет ни одного. ОС может очиститься после завершения процесса - это не глупо.

Я обнаружил, что libnet использует WSAStartup без WSACleanup, почему?

Разработчики библиотеки поняли вышеизложенное - операционная система будет очищаться так же, как и во время принудительного завершения процесса. Диспетчер задач.

WSAStartup может вызывать много раз за один процесс, так как же достаточно обеспечить WSACleanup?

Почему ты бы так поступил? Просто позвоните один раз при запуске. Работа выполнена.

Как легко и элегантно использовать WSAStartup и WSACleanup?

Вызовите WSAStartup один раз при запуске. Вызовите WSACleanup при выходе, если можете, (или если вам это нравится, или если вам от этого становится лучше:).

Дополнительно я написал этот тестовый код для теста WSAStartup без WSAClean, не обнаружил никаких ненормальных (рост памяти или сбой...)

ОС очищается, как и с потоками, файлами, памятью и т. Д.

Если бы настольная ОС общего назначения не заботилась о выделенных ресурсах после завершения процесса, она была бы разумно непригодна для использования.

Другие вопросы по тегам