初期化


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 関数の最後に発生したエラーコード返す
戻り値
エラーコード



前のページへ戻る次のページへ