Winsock 래퍼 라이브러리를 작성 중이며 WSAStartup
프로그램이 실행되고 WSACleanup
프로그램이 종료 될 때 자동으로 호출하고 싶습니다 . 이 두 함수는 생성자와 소멸자가있는 클래스에서 래핑됩니다. 클래스는 여러 인스턴스 등을 처리합니다.
내가 생각한 첫 번째 것은 extern wrapper dummy
라이브러리에서 사용 하기 때문에 어떤 일이 발생하기 전에 인스턴스가 생성되고 프로그램이 종료되면 소멸자가 호출되어야합니다 (제 생각에).
이것이 효과가 있습니까 아니면 더 나은 방법이 있습니까?
초기화 및 초기화 해제를 한 번만 수행하고 winsock 클래스의 해당 클래스에서 상속하는 클래스를 만들 수 있습니다.
이것은 지연 초기화를 수행 하고 정적 초기화 순서 Fiasco 의 위험을 방지합니다 .
예:
#include <stdexcept>
class WSA {
struct Cleaner { // a class to just call WSACleanup()
~Cleaner() { ::WSACleanup(); }
};
static bool in;
static Cleaner cln; // a static instance of the Cleaner class to cleanup only once
static bool init() {
DWORD wVersionRequired = MAKEWORD(2, 2);
WSADATA WSAData;
int rv =::WSAStartup(wVersionRequired , &WSAData);
if(rv) throw std::runtime_error("WSAStartup failed");
return true;
}
};
bool WSA::in = WSA::init(); // init() will only be executed once
WSA::Cleaner WSA::cln;
사용 예 :
class Socket : WSA {
//...
};
모든 인스턴스에 대해 총 하나 bool
+ 하나의 Cleaner
인스턴스를 저장 WSA
하므로 많은 오버 헤드가 발생하지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다