WinSock WSAStartupについて

WSAStartupは以下のように定義されている。

int WSAStartup(
  __in   WORD wVersionRequested, //使用したいWinSockのバージョン
  __out  LPWSADATA lpWSAData     //WSADATA構造体へのポインタ
);




WSAStartupの戻り値は、以下のとおり

戻り値説明
WSASYSNOTREADY基礎となるネットワークサブシステムが、ネットワーク通信の準備ができていない
WSAVERNOTSUPPORTED要求されたWinSockのバージョンは、この特定のWinSockの実装では提供されていない
WSAEINPROGRESSWinSock1.1によるブロッキング操作は、現在進行中です
WSAEPROCLIMWinSockがサポートしているタスク数の制限に達した
WSAEFAULTlpWSAData引数は有効なポインタではない

WSADATA構造体

struct WSAData {
   WORD wVersion;//呼び出し側に求めるWinSockのバージョン
   WORD wHighVersion;//WinSockがサポートしている最も高いバージョン
   char szDescription[WSADESCRIPTION_LEN+1];//WinSockの実装の記述
   char szSystemStatus[WSASYSSTATUS_LEN+1];//WinSockの関連ステータスまたは構成情報
   unsigned short iMaxSockets;//1つのプロセスが開くことができる最大のソケット数
   unsigned short iMaxUdpDg;//WinSockにより送受信できる最大データグラムサイズ
   char FAR * lpVendorInfo;//ベンダー固有データ(WinSockの仕様のスコープ外)
};



  • WSAStartupの使用例

  • WSAStartupでWinSockの初期化に成功すれば、関数から得られたwsaDataの値を表示する。ここでは、Winsock1.1を使用しているため、実行結果には、Winsock Versionが1.1と表示される。エラーの場合は、関数の戻り値からその原因を特定しコンソールに表示する。最後に、WSACleanupでWinSockのリソースを解放する。

    #include <stdio.h>
    #include <winsock.h>
    
    #pragma comment(lib, "wsock32.lib")
    
    int main()
    {
        WSADATA wsaData;
        int nRet;
    
        nRet = WSAStartup(MAKEWORD(1, 1), &wsaData);
        if (nRet == 0) {
            printf("WinSock Version: %d.%d\n", HIBYTE(wsaData.wVersion), LOBYTE(wsaData.wVersion));
            printf("High Version: %d.%d\n", HIBYTE(wsaData.wHighVersion), LOBYTE(wsaData.wHighVersion));
            printf("Description: %s\n", wsaData.szDescription);
            printf("SystemStatus: %s\n", wsaData.szSystemStatus);
            printf("MaxUdpDg: %d\n", wsaData.iMaxUdpDg);
            printf("MaxSockets: %d\n", wsaData.iMaxSockets);
        } else {
            fprintf(stderr, "WSAStartup() Error %d\n", nRet);
            switch (nRet) {
            case WSASYSNOTREADY:
                puts("WSASYSNOTREADY");
                break;
    
            case WSAVERNOTSUPPORTED:
                puts("WSAVERNOTSUPPORTED");
                break;
    
            case WSAEINPROGRESS:
                puts("WSAEINPROGRESS");
                break;
    
            case WSAEPROCLIM:
                puts("WSAEPROCLIM");
                break;
    
            case WSAEFAULT:
                puts("WSAEFAULT");
                break;
    
            default:
                puts("Other error");
                break;
            }
        }
    
        WSACleanup();
    
        return 0;
    }


    実行結果

    WinSock Version: 1.1
    High Version: 2.2
    Description: WinSock 2.0
    SystemStatus: Running
    MaxUdpDg: 65467
    MaxSockets: 32767


    参考:
    http://msdn.microsoft.com/en-us/library/ms742213.aspx
    http://msdn.microsoft.com/ja-jp/library/ms931137.aspx