初期化
WinSockの情報
まず、WinSock API を用いるために、DLLを初期化しなければなりません
DLL を利用するには、ws2_32.lib をインポートし
winsock2.h ヘッダファイルをインクルードしなければなりません
WinSock 2 は、基本的にこの前のバージョン WinSock 1.1 も含んでいます
DLL を初期化するには WSAStartup() 関数を呼び出します
int WSAStartup (WORD wVersionRequested , LPWSADATA lpWSAData);
wVersionRequested には、使いたい WinSock のバージョンを指定します
ワードの最上位バイトにマイナーバージョンを
下位バイトにメジャーバージョンを指定します
例えば、WinSock 2.2 であれば ((2 << 8) + 2) と記述する方法があります
lpWSAData には、WinSock の情報を得るために
WSADATA 構造体へのポインタを指定します
関数が成功した場合は 0、そうでなければエラー定数を返します
エラーの場合は、次の定数のいずれかが返ります
定数 | 解説
|
---|
WSASYSNOTREADY | ネットワークサブシステムが ネットワークへの接続準備ができていない
|
WSAVERNOTSUPPORTED | 要求した WinSock のバージョンは このシステムで提供されていない
|
WSAEINPROGRESS | ブロッキング操作の実行中である またはサービスプロバイダがコールバック関数を処理している
|
WSAEPROCLIM | WinSock が同時に処理できる最大プロセスに達成した
|
WSAEFAULT | lpWSAData は有効なポインタではない
|
WinSock の実装情報は WSADATA 構造体に格納されます
この構造体は次のように定義されています
typedef struct WSAData {
WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
} WSADATA, FAR * LPWSADATA;
wVersion は、呼び出し元が期待する WinSock API のバージョンを表します
通常、このメンバは WSAStartup() 関数の wVersionRequested と同じです
wHighVersion は、DLL がサポートする最新の WinSock バージョンが格納されます
szDescription には DLL に関する説明をするための文字列です
szSystemStatus は、DLL の現在の状態や構成情報が格納されます
これらは、ベンダーが自由に使うことができると定められています
iMaxSockets と iMaxUdpDg は WinSock 1.1 時代に使われていたもので
利用可能な最大ソケット数と、UDPデータグラムの最大サイズを表しますが
WinSock 2 以降では使われることはありません
lpVendorInfo は、ベンダー固有の情報を含むバッファへのポインタです
やはり、このポインタがさすバッファの形式はベンダーに委ねられています
プロセスは、WinSock の利用が終了すれば
WSACleanup() 関数を使ってリソースを解放します
int WSACleanup (void);
関数が成功すれば 0、失敗すれば SOCKET_ERROR 定数が返ります
#include <stdio.h>
#include <winsock2.h>
int main() {
TCHAR str[1024];
WSADATA wsaData;
WSAStartup(2 , &wsaData);
printf("バージョン = %d.%d\n記述 = %s\n状態 = %s\n" ,
(BYTE)wsaData.wHighVersion , wsaData.wHighVersion >> 8 ,
wsaData.szDescription , wsaData.szSystemStatus
);
WSACleanup();
return 0;
}
このプログラムは、標準出力にインストールされている WinSock の情報を表示します
例えば、次のような結果が表示されるでしょう
バージョン = 2.2
記述 = WinSock 2.0
状態 = Running
このことから、WinSock 2 がインストールされていることを確認できます
しかし、WinSock が 1.1 で、要求が 2 だったとしても、関数は成功します
この場合、WinSock は 1.1 の機能しか使えないため、問題となるでしょう
アプリケーションは、バージョンをチェックして問題を通知するべきです
WinSock で発生したエラーは、WSAStartup() 関数以外は返しません
通常、発生したエラーは WSAGetLastError() 関数で補足します
int WSAGetLastError (void);
この関数は、現在のスレッドで利用された WinSock 関数の
最後に発生したエラーコードを返します
エラーコードについては、様々なエラーがあるので、この場では省略します
WSAStartup
- int WSAStartup (WORD wVersionRequested , LPWSADATA lpWSAData);
- WinSock を初期化する
- wVersionRequested
- 要求する WinSock のバージョン
- lpWSAData
- WSADATA 構造体へのポインタ
- 戻り値
- 関数が成功した場合は 0、そうでなければエラー定数
WSACleanup
- int WSACleanup (void);
- WinSock のリソースを解放する
- 戻り値
-
- 関数が成功すれば 0、失敗すれば SOCKET_ERROR 定数
WSAGetLastError
- int WSAGetLastError (void);
- WinSock 関数の最後に発生したエラーコード返す
- 戻り値
-
- エラーコード