※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

~ネットワーク(WinSock)プログラミングの第一歩~

まずは自分のPCのソケットバージョンを調べる基礎プログラムです。

WinSockを使う為には「WSock32.lib」を追加しなければいけません。
Visual studio 2008なら
プロジェクト(P) -> ○○のプロパティ...(P) > 構成プロパティ > リンカ > 入力 > 追加の依存ファイル
に「WSock32.lib」を追加しましょう。
もしくは「#pragma comment(lib, "Ws2_32.lib");」をプログラムの先頭に書く事で追加されます。


// winsock2.hを使用する場合、これを書くとコンパイルが早くなる
// また、windows.hと定義が重複しているので#defineを行わないと二重定義となります
#define WIN32_LEAN_AND_MEAN

#include <stdio.h>
#include <conio.h>
#include <winsock2.h> // ソケットを利用する為のヘッダー

#pragma comment(lib, "Ws2_32.lib"); // WinSockを使用する為

void main()
{
WSADATA WsaData; // ソケットに関する情報を格納する
int nRtn; // エラー用

// WinSock(ソケット)の初期化
nRtn = WSAStartup(MAKEWORD(1, 1), &WsaData);
if(nRtn != 0) // エラーチェック
{
fprintf(stderr, "WSAStartup失敗\n");
getch();
}

// 呼び出し元が使用すると期待されるWinSockのバージョン
printf("wVersion = %d.%d\n", LOBYTE(WsaData.wVersion), HIBYTE(WsaData.wVersion));

// このdllがサポートしている最新のバージョン
printf("wVersion = %d.%d\n", LOBYTE(WsaData.wHighVersion), HIBYTE(WsaData.wHighVersion));

// このdllの説明テキストが格納
printf("szDescription = %s\n", WsaData.szDescription);

// このdllの現在の状態などを説明するテキストが格納
printf("szSystemStatus = %s\n", WsaData.szSystemStatus);

// 利用できるソケットの最大数
printf("iMaxSockets = %d\n", WsaData.iMaxSockets);

// WinSock1.1の場合、UDPデータグラムで送受信出来る最大バイト数
printf("iMaxUdpDg = %d\n", WsaData.iMaxUdpDg);
printf("WSAStartup成功\n");

// Winsockのリソースを開放する
nRtn = WSACleanup();
if(nRtn == SOCKET_ERROR) // エラーチェック
{
fprintf(stderr, "WSACleanup失敗\n");
getch();
}

printf("WSACleanup成功\n");
getch();
}


詳細説明
int WsaStertup(WORD wVersionRequested, LPWSADATA lpWSAData)
WinSock(ソケット)を初期化する関数です。
第一引数 使いたいソケットのバージョンを指定する
上位バイトにはマイナーバージョン
下位バージョンにはメジャーバージョン
この指定にはMAKEWORDマクロが便利
第二引数 WSADATAのポインタ
成功すると「0」が返ってきます。
それ以外は以下のエラーコードが返ってきます。
エラーコード 意味
WSASYSNOTREADY ネットワークサブシステムの準備が整ってない
WSAVERNOTSUPPORTED 要求されているソケットのバージョンが対応していない
WSAEINNPROGRESS ブロッキングが既にされている
WSAEPROCLIM ソケットが処理出来るタスクの限界に達した
WSAEFAULT lpWSADataが有効なポインタでない

WORD MAKEWORD(BYTE bLow, BYTE bHigh)
2つの引数から1つのWORDを作成する。
第一引数 下位バイト
第二引数 上位バイト

int WSACleanup(void)
Winsockのリソースを開放する。
成功すると「0」が返ってきます。
そうでない時は「SOCKET_ERROR」が返ってきます。
どんなエラーが返ってきたのか知りたい時はWSAGetLastErrorを呼び出して下さい。

int WSAGetLastError(void)
最後に発生したエラーステータスを返します。
添付ファイル