1.ソケットの作成を行う。↓2.サーバに接続する。↓3.サーバと送受信を行う。↓4.ソケットを破棄する。4段階から成り立ちます。同期型のAPIを使った場合との違いは、サーバに接続した時や、サーバからデータを受信したときなのどソケットイベントがウィンドウメッセージで通知されることです。Interface)を使用してもう少し詳しくあらわすと、WSAStartup関数でWinSockの初期化を行います。(プログラムの開始時のみ)socket関数でソケットの作成を行います。サーバのIPアドレスを取得します。inet_addr関数でIPアドレスの取得ができなかった場合は、WSAAsyncGetHostByName関数でサーバのIPアドレスの取得を行います。このときサーバの情報が取得できたらウィンドウメッセージとして通知されます。WSAAsyncSelect関数でソケットイベントをウィンドウメッセージで通知されるようにします。作成されたソケットを使用して、サーバのIPアドレスとポート番号を指定してconnect関数でサーバに接続(コネクト)します。サーバと接続するとウィンドウメッセージで通知されます。送信バッファに空きができたことを通知するウィンドウメッセージが来たら、ソケットに対して、send関数で接続しているサーバにデータを送信します。サーバからのデータを受信したことを通知するウィンドウメッセージが来たら、ソケットに対してrecv関数でサーバからデータを受信します。サーバから切断したことを通知するウィンドウメッセージが来たら、closesocket関数でソケットを破棄します。送受信するべきデータが無くなったら、shutdown関数で送受信を無効にして、closesocket関数でソケットを破棄します。WSACleanup関数でWinSockのリソースを解放します。(プログラムの終了時のみ)となります。■APIの使用方法WinSockのAPIを使用した例を示します。WinSockを使用する際は、wsock32.libをリンクwinsock.hをインクルードする必要があります。メインのメッセージとなっています。"atexit(WSACleanup)に失敗しました。"WinSockの初期化に失敗しました。MB_ICONERROR);return;}WSAStartup関数の第一引数は、要求するWinSockのバージョンを入れます。(*)(void))(WSACleanup))は、終了時にWSACleanup関数を実行するようにしています。"ソケットの作成に失敗しました。MB_ICONERROR);}socket関数の第1引数には、インターネットを表すPF_INETを指定して、第2引数にはTCPを表すSOCK_STREAMを指定しています。第3引数は、プロトコルを指定します。0){MessageBox(hWnd,"サーバのIPアドレスの取得に失敗しました。0){MessageBox(hWnd,"サーバのIPアドレスの取得に失敗しました。MB_ICONINFORMATION);}break;::SvNameにドットで区切った10進数のIPアドレスが入っている場合は、inet_addr関数で32bitの整数値に変換されます。23E92D2SvNameにサーバのホスト名が入っている場合は、WSAAsyncGetHostByName関数でサーバのホスト情報を取得します。WSAAsyncGetHostByName関数は、gethostbyname関数と違って処理がすぐもどります。(すぐにホスト情報が取得できるわけではない)WSAAsyncGetHostByName関数の第1引数は、メッセージを通知するウィンドウのハンドルです。第2引数は、通知するメッセージです。第3引数は、ホスト情報を取得するサーバの名前へのポインタです。第4引数は、ホスト情報を格納するバッファへのポインタです。このバッファのサイズは、hostent構造体より大きい必要があり、MAXGETHOSTSTRUCTはそれを保証します。第5引数は、第4引数で指定するバッファのサイズです。戻り値は、非同期なタスクのハンドルです。ホスト情報が取得できると、ウィンドウにメッセージが通知されます。ウィンドウプロシージャのwPramaには、WSAAsyncGetHostByName関数の戻り値である非同期なタスクのハンドルが入っています。以外の場合はエラーです。lParamの下位ワードには取得したホスト情報の長さが入っていて、WSAGETASYNCBUFLENマクロで取得できます。WSAAsyncGetHostByName関数の第4引数で指定したバッファには、サーバのホスト情報が入っているので、その中からIPアドレスを取り出します。サーバのホスト情報の中からIPアドレスを取り出しますこのWSAAsyncGetHostByName関数のタスクをキャンセルするには、WSACancelAsyncRequest関数を使います。WSACancelAsyncRequest関数の引数には、WSAAsyncGetHostByName関数の戻り値である非同期なタスクのハンドルを指定します。SOCKET_ERROR){MessageBox(hWnd,"ソケットイベントを通知させる設定に失敗しました。MB_ICONERROR);}WSAAsyncSelect関数は、指定のソケットの接続や送信や受信や切断などのイベントをウィンドウメッセージで通知させるようにする関数です。WSAAsyncSelect関数の第1引数は、イベントをウィンドウメッセージで通知させるようにするソケットです。第2引数は、ソケットイベントのウィンドウメッセージを受け取るウィンドウのハンドルです。第3引数は、通知するメッセージです。第4引数は、通知させるイベントのタイプです。FD_CONNECTは、ソケットへの接続が完了したことを通知します。FD_WRITEは、ソケットの送信バッファに空きができたことを通知します。FD_READは、ソケットの受信バッファにデータがあることを通知します。FD_CLOSEは、ソケットへの接続が終了したことを通知します。場合は成功で、SOCKET_ERRORの場合はエラーです。複数のソケットを扱う場合は、ソケット毎にWSAAsyncSelect関数を実行します。同一ソケットに対して複数回WSAAsyncSelect関数を実行した場合、最後に実行したWSAAsyncSelect関数だけ有効になり、それ以前のは無効になるので注意してください。ウィンドウにソケットイベントが通知されるときは、第3引数で指定したメッセージで通知されます。ウィンドウプロシージャのwParamにはイベントが生じたソケットが入っています。lParamの上位ワードにはエラーコードが入っています。以外の場合はエラーです。lParamの下位ワードにFD_CONNECTやFD_WRITEやFD_READやFD_CLOSEなどのイベントのタイプが入っています。WSAGETSELECTEVENTマクロで取得できます。WSAEWOULDBLOCK){MessageBox(hWnd,"サーバへの接続に失敗しました。*/MessageBox(hWnd,"ソケットイベントの通知でエラーが発生しました。*/MessageBox(hWnd,"サーバに接続しました。MB_ICONINFORMATION);break;::サーバのアドレスの構造体にサーバのIPアドレスとポート番号を設定して、connect関数で接続を行っています。connect関数の第1引数は、socket関数で作成されたソケットです。第2引数は、サーバのアドレスの構造体へのポインタで、第3引数はその構造体のサイズです。サーバとの接続が完了すると、ウィンドウにWSAAsyncSelect関数で指定したメッセージが通知されます。そのときの、イベントのタイプは、FD_CONNECTです。*/MessageBox(hWnd,"ソケットイベントの通知でエラーが発生しました。WSAEWOULDBLOCK){MessageBox(hWnd,"サーバへの送信に失敗しました。MB_ICONERROR);closesocket(soc);}break;}break;::send関数の第1引数は、socket関数で作成されたソケットです。第2引数は送信する文字列のバッファで、第3引数は文字列の長さです。送信バッファに空きがあると、ウィンドウにWSAAsyncSelect関数で指定したメッセージが通知されます。そのときの、イベントのタイプは、FD_WRITEです。接続したあと一度このイベントが発生します。その後送信バッファに空きがある間このイベントが発生します。*/MessageBox(hWnd,"ソケットイベントの通知でエラーが発生しました。){MessageBox(hWnd,"サーバからの受信に失敗しました。*/break;::recv関数の第1引数は、socket関数で作成されたソケットです。第2引数は受信するバッファで、第3引数は受信バッファのサイズです。文字列を受信する場合は、受信した文字列の最後にヌル文字は付加されていないので、recv関数の戻り値である受信サイズを使ってヌル文字を付加します。受信バッファにデータがあると、ウィンドウにWSAAsyncSelect関数で指定したメッセージが通知されます。そのときの、イベントのタイプは、FD_READです。100Kのデータがあって50Kしか読まなかった場合、受信バッファには50Kのデータが残っているので、またこのイベントが発生します。*/MessageBox(hWnd,"ソケットイベントの通知でエラーが発生しました。*/MessageBox(hWnd,"サーバから切断しました。MB_ICONINFORMATION);closesocket(soc);break;::サーバへの接続が終了すると、ウィンドウにWSAAsyncSelect関数で指定したメッセージが通知されます。そのときの、イベントのタイプは、FD_CLOSEです。受信バッファにはデータが残っている場合があるので、closesocket関数を実行する前に受信バッファからデータを受信してしまう方がいいです。*/closesocket(soc);shutdown関数の第1引数は、socket関数で作成されたソケットです。第2引数は、送信と受信の両方を無効にしています。closesocket関数の第1引数は、socket関数で作成されたソケットです。*/WSACleanup();WinSockのリソースを解放する関数ですが、プログラムの初めにatexit()を使って終了時に呼び出されるようにしておけばいいと思います。●エラーコードを取得する場合WinSockのAPIを使用してエラーになった場合、WSAGetLastError関数でエラーコードを取得することができます。Programming。