WinSock構造体、定数、関数

■定数、マクロ

●MAKEWORD
	MAKEWORD(BYTE low, BYTE high);
		引数:
			BYTE low:
				BYTEの値を下位8ビットで使用する
				
			BYTE high:
				BYTEの値を上位8ビットで使用する

		内容:
			二つのバイトの値からWORDの値を作りだす。
			WinSockではWORDの値の上位8ビットをマイナーバージョン、
			下位8ビットをメジャーバージョンとして使用している

		例:
			// WinSockバージョン2.0の値を作成する
			WORD version = MAKEWORD(2, 0);

●SOKET型
	ポインタ長のunsigned int型

■構造体

●WSADATA構造体
	typedef struct
	{
		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, *LPWSADATA;

	内容:
		WindowsSocketsの情報をまとめた構造体

	メンバ変数:
		WORD wVersion:
			実際に使用するバージョン
		
		WORD wHighVersion:
			dllがサポートしている最新のバージョン
		
		char szDescription[WSADESCRIPTION_LEN + 1]:
			dllの説明テキスト
	
		char szSystemStatus[WSASYS_STATUS_LEN + 1]:
			dllの現在の状態
	
		unsigned short iMaxSockets:
			ソケットの最大数
		
		unsigned short iMaxUdpDg:
			UDPデータグラムの送受信最大バイト数
	
		char FAR* lpVendorInfo:
			ベンダ情報(旧仕様のなごり)

●hostent構造体
	typedef struct hostent {
		char FAR *h_name;
		char FAR FAR ** h_aliases;
		short h_addrtype;
		short h_length;
		char FAR FAR ** h_addr_list;
	} hostent;

	内容:
		ホスト情報を格納するための構造体

	char FAR *h_name:
		ホストの正式名称(FDQN)

	char FAR FAR **h_aliases:
		ホストの別名が格納されたNULLで終わる配列のポインタ

	short h_addrtype:
		アドレスタイプ

	short h_length:
		アドレスのサイズ(IPv4は4、IPv6は16を指定)

	char FAR FAR **h_addr_list:
		アドレスのリストが格納されたNULLで終わる配列のポインタ

●SOCKADDR構造体
	struct sockaddr
	{
		ADDRESS_FAMILY sa_famly;
		CHAR sa_data[14];
	};
	typedef sockaddr SOCKADDR;

	内容:
		ソケットアドレスの情報を格納する構造体
	
	メンバ変数:
		ADDRESS_FAMILY sa_family:
			アドレスファミリの種類(AF_INET)
		
		CHAR sa_data[14]:
			アドレス情報

●SOCKADDR_IN構造体
	struct sockaddr_in
	{
		short sin_family;
		unsigned short sin_port;
		in_addr sin_addr;
		char sin_zero[8];
	};
	typedef sockaddr_in SOCKADDR_IN;

	内容:
		ソケットアドレスの情報を格納する構造体
		SOCKADDRとは違い、ポート番号を保存することができる

	メンバ変数:
		short sin_family:
			アドレスファミリの種類(AF_INET等)
		
		unsigned short sin_port:
			ポート番号
		
		in_addr sin_addr:
			IPアドレス
		
		char sin_zero[8]:
			パディング
			※sock_addrと同じサイズにするための変数

■関数

●WSAStartup関数
	int WSAStartup(DWORD wVersionRequested, LPWSADATA lpWSAData);

	引数:
		DWORD wVersionRequested:
		
		LPWSADATA lpWSAData:

	戻り値:
		0:初期化成功
		非0:エラーコード

	内容:
		初期化したいWinSockのバージョンを第一引数に設定し、
		初期化後の情報を第二引数のLPWSADATAに格納する。
		関数が成功したら0が返り、失敗したらエラーコードが返る

●WSACleanup関数
	int WSACleanup(void);

	引数:
		なし
	
	戻り値:
		成功:0
		失敗:SOCKET_ERROR
	
	内容:
		WinSockのリソースを解放する
		成功すると0、失敗するとSOCKET_ERRORを返す
		エラーの詳細は⑤のWSAGetLastErrorを使用することで、
		知ることができる。

●WSAGetLastError関数
	int WSAGetLastError(void);

	引数:
		なし
	
	戻り値:
		エラー番号
	
	内容:
		最後に失敗したWinSock処理のエラー番号を返す

●socket関数
	SOCKET socket(int domain, int type, int protocol);

	内容:
		引数に指定した情報でソケットを作成する

	戻り値:
		成功:作成されたソケット値
		失敗:INVALID_SOCKET

	引数:
		int domain:
			通信を行うドメインを指定する
			種類が複数あるが基本的にAF_INET、またはAF_INET6を使用する

			AF_INET:
				IPv4インターネットプロトコル
		
			AF_INET6:
				IPv6インターネットプロトコル
		
		int type:
			通信方式を指定する
			これもいくつかの種類があるがTCPはSCOK_STREAM、
			UDPはSOCK_DGRAMを使用します。

			SCOK_STREAM:
				接続型通信(TCP)形式で通信を行う
		
			SOCK_DGRAM:
				非接続型通信(UDP)形式で通信を行う
		
		int protocol:
			プロトコルの指定を行いますが、0を指定すると
			WinSockが自動的に接続してくれる

●gethostbyname関数
	hostent *gethostbyname(const char *host_name);

	内容:
		ホスト名からそのホストに関する方法を取得する

	戻り値:
		成功:hostent構造体のポインタ
		失敗:NULL

	引数:
		const char *host_name
			情報を取得したいホスト名

●inet_addr関数
	unsigned long inet_addr(const char FAR	*cp)

	内容:
		「.」を含んだIPv4のアドレスを表す文字列を、数値表現に変換する

	戻り値:
		成功:変換後の値
		失敗:INADDR_NONE
				
	引数:
		const char FAR	*cp:
			アドレスの文字列(182.22.59.229など)

●gethostbyaddr関数
	strcut hostent *gethostbyaddr(char *addr, int len, int type)

	内容:
		ネットワークアドレスからホスト情報を取得する
	
	戻り値:
		成功:hostent構造体のポインタ
		失敗:NULL
	
	引数:
		char *addr:
			アドレス文字列(182.22.59.229など)を数値変換した
			値の先頭アドレス
		
		int len:
			アドレスの長さ(IPv4は4)
		
		int type:
			アドレスの種類(AF_INET等)

●accept関数
	SOCKET accept(SOCKET sock, struct sockaddr *from_addr,int *from_addr_len);

	内容:
		相手からの接続を許可する

	戻り値:
		成功:相手と接続状態になった新しいソケット
		失敗:INVALID_SOCKET

	引数:
		SOCKET sock:
			接続を行うソケット

		struct sockaddr *from_addr:
			クライアント情報格納用アドレスデータ構造体

		int *from_addr_len:
			アドレスデータ構造体のサイズ

●connetct関数
	int connect(SOCKET sock, const sockaddr *name, int namelen);

	内容:
		指定したソケットへの接続を行う
	
	戻り値:
		成功:0
		失敗:SOCKET_ERROR
	
	引数:
		SOCKET sock:
			接続を行うソケット
		
		const sockaddr *name:
			ソケット情報構造体のポインタ
		
		int namelen:
			第二引数のサイズ

●send関数
	int send(SOCKET sock, const char *buff, int len, int flag);

	内容:
		接続したソケットにデータを送信する
		
	戻り値:
		成功:送信バイト数
		失敗:SOCKET_ERROR
	
	引数:
		SOCKET sock:
			送信に使用するソケット

		const char *buff:
			送信データ

		int len:
			送信データのサイズ

		int flags:
			基本0

●recv関数
	int recv(SOCKET sock, char *buff, int len, int flag);

	内容:
		接続したソケットからデータを受信する
	
	戻り値:
		成功:受信したデータのバイト数
		失敗:SOCKET_ERROR
	
	引数:
		SOCKET sock:
			受信に使用するソケット
	
		char *buff:
			受信データ格納用バッファ
		
		int len:
			受信用バッファのサイズ
			
		int flag:
			基本0

●shutdown関数
	int shutdown(SOCKT socket, int how);

	内容:
		指定されたソケットの送受信を停止する
		
	戻り値:
		成功:0
		失敗:SOCKET_ERROR
	
	引数:
		SOCKET socket:
			送受信を停止するソケット
		
		int how:
			停止内容:
				SD_SEND:送信停止
				SD_RECEIVE:受信停止
				SD_BOTH:送受信停止

●closesocket関数
	int closesocket(SOCKET socket)

	内容:
		ソケットを閉じる
	
	戻り値:
		成功:0
		失敗:SOCKET_ERROR
	
	引数:
		SOCKET socket:
			閉じるソケット