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:
閉じるソケット