ウィンドウソケットの初期化と終了


(2-3図)
上の図は、すべてのWinにおけるアプリケーションの汎用構造を示しています.クラウドでの初期化と終了方法について説明します.

WSAStartup


すべてのWinのプログラムはソケット関数を呼び出す前に、Winの初期化関数WSAStartup()を呼び出さなければなりません.WSAStartup()関数はリクエストプログラムで使用されるウィンウィンバージョンにより、ウィンウィンライブラリを初期化する役割を果たす(ws2_32.DLL).WSAStartup()関数が失敗した場合、ws2_32.DLLメモリにロードされません.この場合、WSAGetLastError()関数が返すエラーコードが正しくないため、WSAStartup()関数はエラーコードを返すように設計されている.
// 성공: 0, 실패: 오류코드
int WSAStartup(
	WORD wVersionRequested,
    LPWSADATA lpWSAData
);
  • wVersionResquested:プログラム要求の最高のウィンウィンバージョンです.サブ8ビットにプライマリ・バージョン、上位8ビットにセカンダリ・バージョンを追加します.例えば、クラウドに3.2版の転記を要求する場合は、0x0203またはMAKEWORD(3, 2)
  • lpWSADA:WSADATA構造体が入手可能なウィンドウから提供されるウィンウィンの実現に関する情報(アプリケーションが実際に使用するウィンウィンバージョン、システムがサポートするウィンウィントップバージョンなど)を伝達する.しかし、アプリケーションはこれらの情報を使用する必要はほとんどありません.
  • WSADATA


    実装Winに関する情報を含むことができる構造体として、初期化関数内部でWinにおける属性情報として設定される.
    実際のネットワークプログラミングで使用する必要はありませんが、サブバージョンと互換性を保つために保持されます.WSADATA構造体はwinsock.hで確認でき、定義は以下の通り.
    typedef struct WSAData
    {
        WORD           wVersion;
        WORD           wHighVersion;
        unsigned short iMaxSockets;
        unsigned short iMaxUdpDg;
        char           *lpVendorInfo;
        char           szDescription[WSADESCRIPTION_LEN + 1];
        char           szSystemStatus[WSASYS_STATUS_LEN + 1];
    }	WSADATA;
  • wVersion:クイックバージョン
  • wHighVersion:使用可能な親バージョンがwVersionと一致
  • iMaxSockets:最大スロット数
  • iMaxUdpDg:データ報知メッセージの最大サイズ
  • lpVendorInfo:仕入先情報
  • szDescription[WADESCRIPTION LEN+1:ウィンウィンの実現についての説明
  • szSystemStatuspWSASYS STATUS LEN+1:関連状態または構成情報
  • WSAstartup()関数を使用する際の注意点

  • WSAStartup()関数を呼び出す場合、同一のウィンウィンバージョンを要求しても、実際に利用可能なプロトコルはオペレーティングシステムによって異なるので注意が必要です.
    たとえば、IPv 6はWindows XPSP 1以降でのみ使用でき、BluetoothはWindows XPSP 2以降でのみ使用できます.

  • 複数回呼び出せるWSAStartup()関数
    例えば、MFCソケットクラスではWinの1.1バージョンのみがサポートされているが、Winの2.2バージョンを使用するために、WSAStartup()関数を再度呼び出すことができる.ただし、WSAStartup()関数を呼び出す回数だけで、SWACleanup()関数を呼び出す必要があります.
  • WSACleanup


    プログラムを終了する場合はWinの終了関数を呼び出すべきWSACleanup()WSACleanup()関数の役割は、Wineの使用停止をオペレーティングシステムに知らせ、関連リソースを返すことである.
    関数呼び出しに失敗した場合は、WSAGetLastError()関数を呼び出して具体的なエラーコードを得ることができます.
    // 성공: 0, 실패: SOCKET_ERROR
    int WSACleanup(void);

    補間間での初期化と終了


    上記の内容を使用してWinを初期化および終了する簡単なコンソールアプリケーションを以下に示します.
    #pragma comment(lib, "ws2_32")
    #include <winsock2.h>
    
    int main(int argc, char *argv[])
    {
    	// 윈속 초기화
        WSADATA wsa;
        if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
        	return 1;
        MessageBox(NULL, "윈속 초기화 성공", "알림", MB_OK);
        
        // 윈속 종료
        WSACleanup();
        return 0;
    }
    コンパイル、リンク後の実行結果は次のとおりです.
    (2-4図)
    参考資料
    金成祐著、「TCP/IPウィンドウソケットプログラミング」、星光学院、2018