CAsyncSocket クラス

Windows ソケット (ネットワーク通信のエンドポイント) を表します。

構文

class CAsyncSocket : public CObject

メンバー

パブリック コンストラクター

名前 説明
CAsyncSocket::CAsyncSocket CAsyncSocket オブジェクトを構築します。

パブリック メソッド

名前 説明
CAsyncSocket::Accept ソケット上の接続を受け入れます。
CAsyncSocket::AsyncSelect ソケットのイベント通知を要求します。
CAsyncSocket::Attach ソケット ハンドルを CAsyncSocket オブジェクトにアタッチします。
CAsyncSocket::Bind ローカル アドレスをソケットに関連付けます。
CAsyncSocket::Close ソケットを閉じます。
CAsyncSocket::Connect ピア ソケットへの接続を確立します。
CAsyncSocket::Create ソケットを作成します。
CAsyncSocket::CreateEx 詳細オプションを使用してソケットを作成します。
CAsyncSocket::Detach CAsyncSocket オブジェクトからソケット ハンドルをデタッチします。
CAsyncSocket::FromHandle ソケット ハンドルを指定して、 CAsyncSocket オブジェクトへのポインターを返します。
CAsyncSocket::GetLastError 失敗した最後の操作のエラー状態を取得します。
CAsyncSocket::GetPeerName ソケットが接続されているピア ソケットのアドレスを取得します。
CAsyncSocket::GetPeerNameEx ソケットが接続されているピア ソケットのアドレスを取得します (IPv6 アドレスを処理します)。
CAsyncSocket::GetSockName ソケットのローカル名を取得します。
CAsyncSocket::GetSockNameEx ソケットのローカル名を取得します (IPv6 アドレスを処理します)。
CAsyncSocket::GetSockOpt ソケット オプションを取得します。
CAsyncSocket::IOCtl ソケットのモードを制御します。
CAsyncSocket::Listen 受信接続要求をリッスンするソケットを確立します。
CAsyncSocket::Receive ソケットからデータを受信します。
CAsyncSocket::ReceiveFrom データグラムを受信し、ソース アドレスを格納します。
CAsyncSocket::ReceiveFromEx データグラムを受信し、ソース アドレスを格納します (IPv6 アドレスを処理します)。
CAsyncSocket::Send 接続されたソケットにデータを送信します。
CAsyncSocket::SendTo 特定の宛先にデータを送信します。
CAsyncSocket::SendToEx 特定の宛先にデータを送信します (IPv6 アドレスを処理します)。
CAsyncSocket::SetSockOpt ソケット オプションを設定します。
CAsyncSocket::ShutDown ソケットの Send 呼び出しまたは Receive 呼び出しを無効にします。
CASyncSocket::Socket ソケット ハンドルを割り当てます。

保護メソッド

名前 説明
CAsyncSocket::OnAccept Acceptを呼び出すことによって保留中の接続要求を受け入れることができることをリッスン ソケットに通知します。
CAsyncSocket::OnClose ソケットに接続されているソケットが閉じられたことをソケットに通知します。
CAsyncSocket::OnConnect 接続試行が正常に完了したかエラーが発生したかに関係なく、接続ソケットに通知します。
CAsyncSocket::OnOutOfBandData ソケットで読み取る帯域外データがあることを受信ソケットに通知します。通常は緊急メッセージです。
CAsyncSocket::OnReceive Receiveを呼び出して取得するデータがあることをリッスン ソケットに通知します。
CAsyncSocket::OnSend Sendを呼び出してデータを送信できることをソケットに通知します。

パブリック演算子

名前 説明
CAsyncSocket::operator = 新しい値を CAsyncSocket オブジェクトに代入します。
CAsyncSocket::operator SOCKET この演算子を使用して、CAsyncSocket オブジェクトのSOCKET ハンドルを取得します。

パブリック データ メンバー

名前 説明
CAsyncSocket::m_hSocket このCAsyncSocket オブジェクトにアタッチされているSOCKET ハンドルを示します。

解説

クラス CAsyncSocket は Windows ソケット関数 API をカプセル化し、MFC と組み合わせて Windows ソケットを使用するプログラマ向けのオブジェクト指向の抽象化を提供します。

このクラスは、ネットワーク通信を理解するという前提に基づいています。 Unicode 文字列とマルチバイト文字セット (MBCS) 文字列の間のブロック、バイト順の違い、および変換を処理する必要があります。 これらの問題を管理するより便利なインターフェイスが必要な場合は、クラスの CSocketを参照してください。

CAsyncSocket オブジェクトを使用するには、そのコンストラクターを呼び出し、Create関数を呼び出して、受け入れられたソケットを除き、基になるソケット ハンドル (型SOCKET) を作成します。 サーバー ソケットの場合は Listen メンバー関数を呼び出し、クライアント ソケットの場合は Connect メンバー関数を呼び出します。 サーバー ソケットは、接続要求の受信時に Accept 関数を呼び出す必要があります。 残りの CAsyncSocket 関数を使用して、ソケット間の通信を実行します。 完了したら、ヒープ上に作成された CAsyncSocket オブジェクトを破棄します。デストラクターは自動的に Close 関数を呼び出します。 SOCKETデータ型については、「Windows ソケット: 背景」の記事で説明

Note

静的にリンクされた MFC アプリケーションのセカンダリ スレッドで MFC ソケットを使用する場合は、ソケットを使用してソケット ライブラリを初期化する各スレッドで AfxSocketInit を呼び出す必要があります。 既定では、 AfxSocketInit はプライマリ スレッドでのみ呼び出されます。

詳細については、「 Windows Sockets: Using Class CAsyncSocket and related articles.」および「 Windows Sockets 2 APIを参照してください。

継承階層

CObject

CAsyncSocket

要件

ヘッダー: afxsock.h

CAsyncSocket::Accept

ソケット上の接続を受け入れるには、このメンバー関数を呼び出します。

virtual BOOL Accept(
    CAsyncSocket& rConnectedSocket,
    SOCKADDR* lpSockAddr = NULL,
    int* lpSockAddrLen = NULL);

パラメーター

rConnectedSocket
接続に使用できる新しいソケットを識別する参照。

lpSockAddr
接続ソケットのアドレスを受け取る SOCKADDR 構造体へのポインター (ネットワークで知られている)。 lpSockAddr引数の正確な形式は、ソケットの作成時に確立されたアドレス ファミリによって決まります。 lpSockAddrlpSockAddrLenNULLと等しい場合、受け入れられたソケットのリモート アドレスに関する情報は返されません。

lpSockAddrLen
アドレスの長さをバイト単位で lpSockAddr ポインター。 lpSockAddrLenは値の結果パラメーターです。最初は、lpSockAddrが指す領域の量を格納する必要があります。戻り値には、返されるアドレスの実際の長さ (バイト単位) が含まれます。

戻り値

関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEFAULTlpSockAddrLen引数が小さすぎます (SOCKADDR構造体のサイズより小さい)。

  • WSAEINPROGRESS ブロックしている Windows ソケット呼び出しが進行中です。

  • WSAEINVALListenは受け入れる前に呼び出されませんでした。

  • WSAEMFILE キューは受け入れるエントリ時に空であり、使用可能な記述子はありません。

  • WSAENOBUFS 使用できるバッファー領域はありません。

  • WSAENOTSOCK 記述子はソケットではありません。

  • WSAEOPNOTSUPP 参照されるソケットは、接続指向サービスをサポートする型ではありません。

  • WSAEWOULDBLOCK ソケットは非ブロッキングとしてマークされ、受け入れられる接続はありません。

解説

このルーチンは、保留中の接続のキュー内の最初の接続を抽出し、このソケットと同じプロパティを持つ新しいソケットを作成し、 rConnectedSocketに接続します。 キューに保留中の接続がない場合、 Accept は 0 を返し、 GetLastError はエラーを返します。 受け入れられたソケット (rConnectedSocket) を使用して、より多くの接続を受け入れることはできません。 元のソケットは開いたままでリッスンしています。

引数 lpSockAddr は、通信層に知られているように、接続ソケットのアドレスで入力される結果パラメーターです。 Accept は、 SOCK_STREAMなどの接続ベースのソケット型で使用されます。

CAsyncSocket::AsyncSelect

ソケットのイベント通知を要求するには、このメンバー関数を呼び出します。

BOOL AsyncSelect(long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

パラメーター

lEvent
アプリケーションが関心を持つネットワーク イベントの組み合わせを指定するビットマスク。

  • FD_READ 読み取り準備の通知を受け取りたい。

  • FD_WRITE データを読み取ることができるときに通知を受け取りたい。

  • FD_OOB 帯域外データの到着通知を受け取りたい。

  • FD_ACCEPT 受信接続の通知を受信する。

  • FD_CONNECT 接続結果の通知を受け取りたい。

  • FD_CLOSE ピアによってソケットが閉じられたときに通知を受け取りたい。

戻り値

関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEINVAL 指定されたパラメーターのいずれかが無効であることを示します。

  • WSAEINPROGRESS Windows ソケットのブロック操作が進行中です。

解説

この関数は、ソケットに対して呼び出される MFC コールバック通知関数を指定するために使用されます。 AsyncSelect は、このソケットを非ブロッキング モードに自動的に設定します。 詳細については、「 Windows ソケット: ソケット通知」を参照してください。

CAsyncSocket::Attach

このメンバー関数を呼び出して、CAsyncSocket オブジェクトにhSocket ハンドルをアタッチします。

BOOL Attach(
    SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

パラメーター

hSocket
ソケットへのハンドルを格納します。

lEvent
アプリケーションが関心を持つネットワーク イベントの組み合わせを指定するビットマスク。

  • FD_READ 読み取り準備の通知を受け取りたい。

  • FD_WRITE データを読み取ることができるときに通知を受け取りたい。

  • FD_OOB 帯域外データの到着通知を受け取りたい。

  • FD_ACCEPT 受信接続の通知を受信する。

  • FD_CONNECT 接続結果の通知を受け取りたい。

  • FD_CLOSE ピアによってソケットが閉じられたときに通知を受け取りたい。

戻り値

正常終了した場合は 0 以外を返します。

解説

SOCKET ハンドルは、オブジェクトのm_hSocket データ メンバーに格納されます。

CAsyncSocket::Bind

このメンバー関数を呼び出して、ローカル アドレスをソケットに関連付けます。

BOOL Bind(
    UINT nSocketPort,
    LPCTSTR lpszSocketAddress = NULL);

BOOL Bind (
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen);

パラメーター

nSocketPort
ソケット アプリケーションを識別するポート。

lpszSocketAddress
ネットワーク アドレス。"128.56.22.8" などの点線の番号。 このパラメーターに NULL 文字列を渡すと、 CAsyncSocket インスタンスはすべてのネットワーク インターフェイスでクライアント アクティビティをリッスンする必要があることを示します。

lpSockAddr
このソケットに割り当てるアドレスを含む SOCKADDR 構造体へのポインター。

nSockAddrLen
アドレスの長さ (バイト単位) lpSockAddr

戻り値

関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 次の一覧では、返される可能性があるエラーの一部について説明します。 完全な一覧については、「 Windows ソケットのエラー コードを参照してください。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEADDRINUSE 指定したアドレスは既に使用されています。 (SetSockOptSO_REUSEADDR ソケット オプションを参照してください)。

  • WSAEFAULTnSockAddrLen引数が小さすぎます (SOCKADDR構造体のサイズより小さい)。

  • WSAEINPROGRESS ブロックしている Windows ソケット呼び出しが進行中です。

  • WSAEAFNOSUPPORT 指定されたアドレス ファミリは、このポートではサポートされていません。

  • WSAEINVAL ソケットは既にアドレスにバインドされています。

  • WSAENOBUFS 使用可能なバッファーが不足し、接続が多すぎます。

  • WSAENOTSOCK 記述子はソケットではありません。

解説

このルーチンは、後続の Connect または Listen 呼び出しの前に、接続されていないデータグラムまたはストリーム ソケットで使用されます。 接続要求を受け入れる前に、リッスンしているサーバー ソケットはポート番号を選択し、 Bindを呼び出して Windows ソケットに認識させる必要があります。 Bind は、名前のないソケットにローカル名を割り当てることによって、ソケットのローカル関連付け (ホスト アドレス/ポート番号) を確立します。

CAsyncSocket::CAsyncSocket

空のソケット オブジェクトを構築します。

CAsyncSocket();

解説

オブジェクトを構築したら、その Create メンバー関数を呼び出して、 SOCKET データ構造を作成し、そのアドレスをバインドする必要があります。 (Windows ソケット通信のサーバー側では、リッスンしているソケットが Accept 呼び出しで使用するソケットを作成するときに、そのソケットの Create を呼び出しません)。

CAsyncSocket::Close

ソケットを閉じます。

virtual void Close();

解説

この関数はソケット記述子を解放し、ソケット記述子への参照がエラー WSAENOTSOCKで失敗するようにします。 これが基になるソケットへの最後の参照である場合、関連付けられている名前付け情報とキューに格納されたデータは破棄されます。 ソケット オブジェクトのデストラクターは Close を呼び出します。

CAsyncSocketの場合は、CSocketではなく、Closeのセマンティクスは、ソケット オプションのSO_LINGERSO_DONTLINGERの影響を受ける可能性があります。 詳細については、メンバー関数の GetSockOptを参照してください。

CAsyncSocket::Connect

このメンバー関数を呼び出して、接続されていないストリームまたはデータグラム ソケットへの接続を確立します。

BOOL Connect(
    LPCTSTR lpszHostAddress,
    UINT nHostPort);

BOOL Connect(
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen);

パラメーター

lpszHostAddress
このオブジェクトが接続されているソケットのネットワーク アドレス: "ftp.microsoft.com" などのマシン名、または "128.56.22.8" などの点線の番号。

nHostPort
ソケット アプリケーションを識別するポート。

lpSockAddr
接続されているソケットのアドレスを含む SOCKADDR 構造体へのポインター。

nSockAddrLen
アドレスの長さ (バイト単位) lpSockAddr

戻り値

関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 これが WSAEWOULDBLOCKのエラー コードを示し、アプリケーションがオーバーライド可能なコールバックを使用している場合、接続操作が完了すると、アプリケーションは OnConnect メッセージを受け取ります。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEADDRINUSE 指定したアドレスは既に使用されています。

  • WSAEINPROGRESS ブロックしている Windows ソケット呼び出しが進行中です。

  • WSAEADDRNOTAVAIL 指定されたアドレスは、ローカル コンピューターから使用できません。

  • WSAEAFNOSUPPORT 指定されたファミリ内のアドレスは、このソケットでは使用できません。

  • WSAECONNREFUSED 接続の試行が拒否されました。

  • WSAEDESTADDRREQ 宛先アドレスが必要です。

  • WSAEFAULTnSockAddrLen引数が正しくありません。

  • WSAEINVAL ホスト アドレスが無効です。

  • WSAEISCONN ソケットは既に接続されています。

  • WSAEMFILE これ以上ファイル記述子を使用できません。

  • WSAENETUNREACH 現時点では、このホストからネットワークにアクセスできません。

  • WSAENOBUFS 使用できるバッファー領域はありません。 ソケットを接続できません。

  • WSAENOTSOCK 記述子はソケットではありません。

  • WSAETIMEDOUT 接続を確立せずに、タイムアウトした接続を試みます。

  • WSAEWOULDBLOCK ソケットは非ブロッキングとしてマークされ、接続をすぐに完了することはできません。

解説

ソケットがバインドされていない場合、システムによって一意の値がローカル関連付けに割り当てられ、ソケットはバインド済みとしてマークされます。 名前構造のアドレス フィールドがすべてゼロの場合、 Connect は 0 を返します。 拡張エラー情報を取得するには、 GetLastError メンバー関数を呼び出します。

ストリーム ソケット (種類 SOCK_STREAM) の場合、外部ホストへのアクティブな接続が開始されます。 ソケット呼び出しが正常に完了すると、ソケットはデータを送受信する準備が整います。

データグラム ソケット (型 SOCK_DGRAM) の場合、既定の宛先が設定され、後続の Send および Receive 呼び出しで使用されます。

CAsyncSocket::Create

ソケット オブジェクトを作成して Windows ソケットを作成してアタッチした後、 Create メンバー関数を呼び出します。

BOOL Create(
    UINT nSocketPort = 0,
    int nSocketType = SOCK_STREAM,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    LPCTSTR lpszSocketAddress = NULL);

パラメーター

nSocketPort
ソケットで使用される既知のポート。Windows ソケットでポートを選択する場合は 0。

nSocketType
SOCK_STREAM または SOCK_DGRAM

lEvent
アプリケーションが関心を持つネットワーク イベントの組み合わせを指定するビットマスク。

  • FD_READ 読み取り準備の通知を受け取りたい。

  • FD_WRITE 書き込み準備の通知を受け取りたい。

  • FD_OOB 帯域外データの到着通知を受け取りたい。

  • FD_ACCEPT 受信接続の通知を受信する。

  • FD_CONNECT 完了した接続の通知を受け取りたい。

  • FD_CLOSE ソケットクロージャの通知を受け取りたい。

lpszSockAddress
接続されているソケットのネットワーク アドレスを含む文字列へのポインター。"128.56.22.8" などのドット番号。 このパラメーターに NULL 文字列を渡すと、 CAsyncSocket インスタンスはすべてのネットワーク インターフェイスでクライアント アクティビティをリッスンする必要があることを示します。

戻り値

関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEAFNOSUPPORT 指定されたアドレス ファミリはサポートされていません。

  • WSAEINPROGRESS Windows ソケットのブロック操作が進行中です。

  • WSAEMFILE これ以上ファイル記述子を使用できません。

  • WSAENOBUFS 使用できるバッファー領域はありません。 ソケットを作成できません。

  • WSAEPROTONOSUPPORT 指定されたポートはサポートされていません。

  • WSAEPROTOTYPE 指定されたポートがこのソケットに対して正しくない型です。

  • WSAESOCKTNOSUPPORT 指定されたソケットの種類は、このアドレス ファミリではサポートされていません。

解説

CreateSocket を呼び出し、成功した場合は Bind を呼び出して、指定したアドレスにソケットをバインドします。 次のソケットの種類がサポートされています。

  • SOCK_STREAM シーケンス化された信頼性の高い全二重接続ベースのバイト ストリームを提供します。 インターネット アドレス ファミリに伝送制御プロトコル (TCP) を使用します。

  • SOCK_DGRAM 固定 (通常は小さい) 最大長のコネクションレスで信頼性の低いパケットであるデータグラムをサポートします。 インターネット アドレス ファミリにユーザー データグラム プロトコル (UDP) を使用します。

    Note

    Accept メンバー関数は、新しい空の CSocket オブジェクトへの参照をパラメーターとして受け取ります。 Accept を呼び出す前に、このオブジェクトを構築する必要があります。 このソケット オブジェクトがスコープ外になると、接続が閉じられることに注意してください。 この新しいソケット オブジェクトに対して Create を呼び出さないでください。

重要

Create はスレッド セーフではありません。 異なるスレッドによって同時に呼び出すことができるマルチスレッド環境で呼び出す場合は、ミューテックスまたはその他の同期ロックを使用して各呼び出しを保護してください。

ストリーム ソケットとデータグラム ソケットの詳細については、「Windows ソケット: バックグラウンドおよびWindows ソケット: ポートとソケット アドレスおよび Windows Sockets 2 API 」を参照してください。

CAsyncSocket::CreateEx

ソケット オブジェクトを作成して Windows ソケットを作成してアタッチした後、 CreateEx メンバー関数を呼び出します。

ソケットの種類などの高度なオプションを指定する必要がある場合は、この関数を使用します。

BOOL CreateEx(
    ADDRINFOT* pAI,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

パラメーター

pAI
ファミリやソケットの種類などのソケット情報を保持する ADDRINFOT へのポインター。

lEvent
アプリケーションが関心を持つネットワーク イベントの組み合わせを指定するビットマスク。

  • FD_READ 読み取り準備の通知を受け取りたい。

  • FD_WRITE 書き込み準備の通知を受け取りたい。

  • FD_OOB 帯域外データの到着通知を受け取りたい。

  • FD_ACCEPT 受信接続の通知を受信する。

  • FD_CONNECT 完了した接続の通知を受け取りたい。

  • FD_CLOSE ソケットクロージャの通知を受け取りたい。

戻り値

Create()の戻り値を参照してください。

解説

Create()の解説を参照してください。

CAsyncSocket::Detach

このメンバー関数を呼び出して、m_hSocket データ メンバー内のSOCKET ハンドルをCAsyncSocket オブジェクトからデタッチし、m_hSocketNULL に設定します。

SOCKET Detach();

CAsyncSocket::FromHandle

CAsyncSocket オブジェクトへのポインターを返します。

static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);

パラメーター

hSocket
ソケットへのハンドルを格納します。

戻り値

CAsyncSocket オブジェクトへのポインター。または、hSocketにアタッチされているCAsyncSocket オブジェクトがない場合にNULL

解説

SOCKET ハンドルが指定されると、CAsyncSocket オブジェクトがハンドルにアタッチされていない場合、メンバー関数はNULLを返します。

CAsyncSocket::GetLastError

このメンバー関数を呼び出して、失敗した最後の操作のエラー状態を取得します。

static int PASCAL GetLastError();

戻り値

戻り値は、このスレッドによって実行された最後の Windows ソケット API ルーチンのエラー コードを示します。

解説

特定のメンバー関数がエラーが発生したことを示す場合は、 GetLastError を呼び出して適切なエラー コードを取得する必要があります。 該当するエラー コードの一覧については、個々のメンバー関数の説明を参照してください。

エラー コードの詳細については、「 Windows Sockets 2 APIを参照してください。

CAsyncSocket::GetPeerName

このメンバー関数を呼び出して、このソケットが接続されているピア ソケットのアドレスを取得します。

BOOL GetPeerName(
    CString& rPeerAddress,
    UINT& rPeerPort);

BOOL GetPeerName(
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen);

パラメーター

rPeerAddress
ドット番号の IP アドレスを受け取る CString オブジェクトへの参照。

rPeerPort
ポートを格納する UINT への参照。

lpSockAddr
ピア ソケットの名前を受け取る SOCKADDR 構造体へのポインター。

lpSockAddrLen
アドレスの長さをバイト単位で lpSockAddr ポインター。 戻り値の場合、 lpSockAddrLen 引数には、返される lpSockAddr の実際のサイズがバイト単位で格納されます。

戻り値

関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEFAULTlpSockAddrLen引数の大きさが不十分です。

  • WSAEINPROGRESS ブロックしている Windows ソケット呼び出しが進行中です。

  • WSAENOTCONN ソケットが接続されていません。

  • WSAENOTSOCK 記述子はソケットではありません。

解説

IPv6 アドレスを処理するには、 CAsyncSocket::GetPeerNameExを使用します。

CAsyncSocket::GetPeerNameEx

このメンバー関数を呼び出して、このソケットが接続されているピア ソケットのアドレスを取得します (IPv6 アドレスを処理します)。

BOOL GetPeerNameEx(
    CString& rPeerAddress,
    UINT& rPeerPort);

パラメーター

rPeerAddress
ドット番号の IP アドレスを受け取る CString オブジェクトへの参照。

rPeerPort
ポートを格納する UINT への参照。

戻り値

関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEFAULTlpSockAddrLen引数の大きさが不十分です。

  • WSAEINPROGRESS ブロックしている Windows ソケット呼び出しが進行中です。

  • WSAENOTCONN ソケットが接続されていません。

  • WSAENOTSOCK 記述子はソケットではありません。

解説

この関数は、IPv6 アドレスと古いプロトコルを処理する点を除き、 CAsyncSocket::GetPeerName と同じです。

CAsyncSocket::GetSockName

ソケットのローカル名を取得するには、このメンバー関数を呼び出します。

BOOL GetSockName(
    CString& rSocketAddress,
    UINT& rSocketPort);

BOOL GetSockName(
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen);

パラメーター

rSocketAddress
ドット番号の IP アドレスを受け取る CString オブジェクトへの参照。

rSocketPort
ポートを格納する UINT への参照。

lpSockAddr
ソケットのアドレスを受け取る SOCKADDR 構造体へのポインター。

lpSockAddrLen
アドレスの長さをバイト単位で lpSockAddr ポインター。

戻り値

関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEFAULTlpSockAddrLen引数の大きさが不十分です。

  • WSAEINPROGRESS Windows ソケットのブロック操作が進行中です。

  • WSAENOTSOCK 記述子はソケットではありません。

  • WSAEINVAL ソケットは、 Bindを持つアドレスにバインドされていません。

解説

この呼び出しは、最初にBindを行わずにConnect呼び出しが行われた場合に特に便利です。この呼び出しは、システムによって設定されたローカルアソシエーションを決定するための唯一の手段を提供します。

IPv6 アドレスを処理するには、 CAsyncSocket::GetSockNameEx

CAsyncSocket::GetSockNameEx

ソケットのローカル名を取得するには、このメンバー関数を呼び出します (IPv6 アドレスを処理します)。

BOOL GetSockNameEx(
    CString& rSocketAddress,
    UINT& rSocketPort);

パラメーター

rSocketAddress
ドット番号の IP アドレスを受け取る CString オブジェクトへの参照。

rSocketPort
ポートを格納する UINT への参照。

戻り値

関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEFAULTlpSockAddrLen引数の大きさが不十分です。

  • WSAEINPROGRESS Windows ソケットのブロック操作が進行中です。

  • WSAENOTSOCK 記述子はソケットではありません。

  • WSAEINVAL ソケットは、 Bindを持つアドレスにバインドされていません。

解説

この呼び出しは、IPv6 アドレスと古いプロトコルを処理する点を除き、 CAsyncSocket::GetSockName と同じです。

この呼び出しは、最初にBindを行わずにConnect呼び出しが行われた場合に特に便利です。この呼び出しは、システムによって設定されたローカルアソシエーションを決定するための唯一の手段を提供します。

CAsyncSocket::GetSockOpt

ソケット オプションを取得するには、このメンバー関数を呼び出します。

BOOL GetSockOpt(
    int nOptionName,
    void* lpOptionValue,
    int* lpOptionLen,
    int nLevel = SOL_SOCKET);

パラメーター

nOptionName
値を取得するソケット オプション。

lpOptionValue
要求されたオプションの値が返されるバッファーへのポインター。 選択したオプションに関連付けられている値がバッファー lpOptionValueに返されます。 lpOptionLenが指す整数は、もともとこのバッファーのサイズをバイト単位で格納する必要があります。戻り値の場合は、返される値のサイズに設定されます。 SO_LINGERの場合、これはLINGER構造体のサイズになります。他のすべてのオプションでは、オプションに応じて BOOL またはintのサイズになります。 「解説」セクションのオプションとそのサイズの一覧を参照してください。

lpOptionLen
lpOptionValue バッファーのサイズへのポインター (バイト単位)。

nLevel
オプションが定義されているレベル。サポートされているレベルは、 SOL_SOCKETIPPROTO_TCPのみです。

戻り値

関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 オプションが SetSockOpt で設定されなかった場合、 GetSockOpt はオプションの既定値を返します。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEFAULTlpOptionLen引数が無効です。

  • WSAEINPROGRESS Windows ソケットのブロック操作が進行中です。

  • WSAENOPROTOOPT このオプションは不明またはサポートされていません。 特に、 SO_BROADCAST は型 SOCK_STREAMのソケットではサポートされませんが、 SO_ACCEPTCONNSO_DONTLINGERSO_KEEPALIVESO_LINGER、および SO_OOBINLINE は、型 SOCK_DGRAMのソケットではサポートされていません。

  • WSAENOTSOCK 記述子はソケットではありません。

解説

GetSockOpt は、任意の状態の任意の型のソケットに関連付けられているソケット オプションの現在の値を取得し、結果を lpOptionValueに格納します。 オプションは、パケットのルーティング、帯域外データ転送などのソケット操作に影響します。

GetSockOptでは、次のオプションがサポートされています。 Type は、 lpOptionValueによってアドレス指定されたデータの型を識別します。 TCP_NODELAY オプションではレベル IPPROTO_TCPが使用され、他のすべてのオプションではレベル SOL_SOCKETが使用されます。

Type 説明
SO_ACCEPTCONN BOOL ソケットがリスニングしています。
SO_BROADCAST BOOL ソケットは、ブロードキャスト メッセージの送信用に構成されます。
SO_DEBUG BOOL デバッグが有効です。
SO_DONTLINGER BOOL true の場合、 SO_LINGER オプションは無効になります。
SO_DONTROUTE BOOL ルーティングが無効です
SO_ERROR int エラーの状態を取得し、クリアします。
SO_KEEPALIVE BOOL キープアライブが送信されています。
SO_LINGER struct LINGER 現在の残存オプションを返します。
SO_OOBINLINE BOOL 帯域外データは、通常のデータ ストリームで受信されています。
SO_RCVBUF int 受信のバッファー サイズ。
SO_REUSEADDR BOOL ソケットは、既に使用されているアドレスにバインドできます。
SO_SNDBUF int 送信のバッファー サイズ。
SO_TYPE int ソケットの型 (たとえば、 SOCK_STREAM)。
TCP_NODELAY BOOL 送信結合用の Nagle アルゴリズムを無効にします。

GetSockOptでサポートされていないバークレイ ソフトウェアディストリビューション (BSD) オプションは次のとおりです。

Type 説明
SO_RCVLOWAT int 低いウォーターマークを受け取ります。
SO_RCVTIMEO int 受信タイムアウト。
SO_SNDLOWAT int 低いウォーター マークを送信します。
SO_SNDTIMEO int 送信タイムアウト。
IP_OPTIONS IP ヘッダーのオプションを取得します。
TCP_MAXSEG int TCP の最大セグメント サイズを取得します。

サポートされていないオプションでGetSockOptを呼び出すと、GetLastErrorからWSAENOPROTOOPTのエラー コードが返されます。

CAsyncSocket::IOCtl

ソケットのモードを制御するには、このメンバー関数を呼び出します。

BOOL IOCtl(
    long lCommand,
    DWORD* lpArgument);

パラメーター

lCommand
ソケットで実行するコマンド。

lpArgument
lCommandのパラメーターへのポインター。

戻り値

関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEINVALlCommandが有効なコマンドではないか、lpArgumentlCommandに許容できるパラメーターではないか、コマンドが指定されたソケットの種類に適用できません。

  • WSAEINPROGRESS Windows ソケットのブロック操作が進行中です。

  • WSAENOTSOCK 記述子はソケットではありません。

解説

このルーチンは、任意の状態の任意のソケットで使用できます。 プロトコルと通信サブシステムに関係なく、ソケットに関連付けられている操作パラメーターを取得または取得するために使用されます。 次のコマンドがサポートされています。

  • FIONBIO ソケットで非ブロッキング モードを有効または無効にします。 lpArgument パラメーターはDWORDを指します。非ブロッキング モードを有効にする場合は 0 以外、無効にする場合は 0 です。 ソケットで AsyncSelect が発行されている場合、 IOCtl を使用してソケットをブロッキング モードに戻そうとすると、 WSAEINVALで失敗します。 ソケットをブロッキング モードに戻し、WSAEINVAL エラーを防ぐには、アプリケーションはまず、lEvent パラメーターが 0 のAsyncSelectを呼び出してAsyncSelectを無効にしてから、IOCtlを呼び出す必要があります。

  • FIONREAD このソケットからの 1 つの Receive 呼び出しで読み取ることができる最大バイト数を決定します。 lpArgument パラメーターは、IOCtlが結果を格納するDWORDを指します。 このソケットの型が SOCK_STREAMの場合、 FIONREAD は単一の Receiveで読み取ることができるデータの総量を返します。これは通常、ソケットでキューに登録されたデータの総量と同じです。 このソケットが SOCK_DGRAM型の場合、 FIONREAD はソケットでキューに入った最初のデータグラムのサイズを返します。

  • SIOCATMARK すべての帯域外データが読み取られたかどうかを判断します。 これは、帯域外データ (SO_OOBINLINE) のインライン受信用に構成されたSOCK_STREAM型のソケットにのみ適用されます。 帯域外データが読み取りを待機していない場合、操作は 0 以外の値を返します。 それ以外の場合は 0 が返され、ソケットで実行される次の Receive または ReceiveFrom は、"マーク" の前にあるデータの一部またはすべてを取得します。アプリケーションは、 SIOCATMARK 操作を使用して、データが残っているかどうかを判断する必要があります。 "緊急" (帯域外) データの前に通常のデータがある場合は、順番に受信されます。 (ReceiveまたはReceiveFromでは、同じ呼び出しで帯域外データと通常のデータが混在することはありません。lpArgument パラメーターは、IOCtlが結果を格納するDWORDを指します。

この関数は、バークレイソケットで使用される ioctl() のサブセットです。 特に、 FIOASYNCと同等のコマンドはありませんが、サポートされている唯一のソケット レベルのコマンドは SIOCATMARK です。

CAsyncSocket::Listen

このメンバー関数を呼び出して、着信接続要求をリッスンします。

BOOL Listen(int nConnectionBacklog = 5);

パラメーター

nConnectionBacklog
保留中の接続のキューを拡張できる最大長。 有効な範囲は 1 から 5 です。

戻り値

関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEADDRINUSE 使用中のアドレスをリッスンしようとしました。

  • WSAEINPROGRESS Windows ソケットのブロック操作が進行中です。

  • WSAEINVAL ソケットが Bind にバインドされていないか、既に接続されています。

  • WSAEISCONN ソケットは既に接続されています。

  • WSAEMFILE これ以上ファイル記述子を使用できません。

  • WSAENOBUFS 使用できるバッファー領域はありません。

  • WSAENOTSOCK 記述子はソケットではありません。

  • WSAEOPNOTSUPP 参照されるソケットは、 Listen 操作をサポートする型ではありません。

解説

接続を受け入れるために、ソケットは最初に Createで作成され、受信接続のバックログは Listenで指定され、その後接続は Acceptで受け入れられます。 Listen は、接続をサポートするソケット 、つまり SOCK_STREAM型のソケットにのみ適用されます。 このソケットは、受信接続が受信確認され、プロセスによる受け入れ待ちでキューに入れられる "パッシブ" モードになります。

この関数は通常、一度に複数の接続要求を持つ可能性があるサーバー (または接続を受け入れるアプリケーション) によって使用されます。キューがいっぱいになった接続要求が到着すると、クライアントは WSAECONNREFUSEDを示すエラーを受け取ります。

Listen は、使用可能なポート (記述子) がない場合に、引き続き合理的な機能を試みます。 キューが空になるまで、接続を受け入れます。 ポートが使用可能になると、 Listen または Accept の後で呼び出すと、キューが現在または最新の "バックログ" (可能な場合) に補充され、受信接続のリッスンが再開されます。

CAsyncSocket::m_hSocket

このCAsyncSocket オブジェクトによってカプセル化されたソケットのSOCKET ハンドルを格納します。

SOCKET m_hSocket;

CAsyncSocket::OnAccept

Accept メンバー関数を呼び出すことによって保留中の接続要求を受け入れることができることをリッスン ソケットに通知するために、フレームワークによって呼び出されます。

virtual void OnAccept(int nErrorCode);

パラメーター

nErrorCode
ソケットの最新のエラー。 次のエラー コードは、 OnAccept メンバー関数に適用されます。

  • 0 関数が正常に実行されました。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

解説

詳細については、「Windows ソケット: ソケット通知」を参照してください。

CAsyncSocket::OnClose

接続されたソケットがプロセスによって閉じられていることをこのソケットに通知するために、フレームワークによって呼び出されます。

virtual void OnClose(int nErrorCode);

パラメーター

nErrorCode
ソケットの最新のエラー。 OnClose メンバー関数には、次のエラー コードが適用されます。

  • 0 関数が正常に実行されました。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAECONNRESET リモート側で接続がリセットされました。

  • WSAECONNABORTED タイムアウトまたはその他のエラーが原因で接続が中止されました。

解説

詳細については、「Windows ソケット: ソケット通知」を参照してください。

CAsyncSocket::OnConnect

正常に実行されたかエラーが発生したかに関係なく、接続試行が完了したことをこの接続ソケットに通知するためにフレームワークによって呼び出されます。

virtual void OnConnect(int nErrorCode);

パラメーター

nErrorCode
ソケットの最新のエラー。 OnConnect メンバー関数には、次のエラー コードが適用されます。

  • 0 関数が正常に実行されました。

  • WSAEADDRINUSE 指定したアドレスは既に使用されています。

  • WSAEADDRNOTAVAIL 指定されたアドレスは、ローカル コンピューターから使用できません。

  • WSAEAFNOSUPPORT 指定されたファミリ内のアドレスは、このソケットでは使用できません。

  • WSAECONNREFUSED 接続の試行が強制的に拒否されました。

  • WSAEDESTADDRREQ 宛先アドレスが必要です。

  • WSAEFAULTlpSockAddrLen引数が正しくありません。

  • WSAEINVAL ソケットは既にアドレスにバインドされています。

  • WSAEISCONN ソケットは既に接続されています。

  • WSAEMFILE これ以上ファイル記述子を使用できません。

  • WSAENETUNREACH 現時点では、このホストからネットワークにアクセスできません。

  • WSAENOBUFS 使用できるバッファー領域はありません。 ソケットを接続できません。

  • WSAENOTCONN ソケットが接続されていません。

  • WSAENOTSOCK 記述子は、ソケットではなくファイルです。

  • WSAETIMEDOUT 接続の試行が、接続を確立せずにタイムアウトしました。

解説

Note

CSocket では、OnConnect 通知関数は呼び出されません。 接続の場合は、 Connectを呼び出すだけで、接続が完了すると (正常に、またはエラーで) 返されます。 接続通知の処理方法は、MFC 実装の詳細情報です。

詳細については、「Windows ソケット: ソケット通知」を参照してください。

void CMyAsyncSocket::OnConnect(int nErrorCode) // CMyAsyncSocket is
                                               // derived from CAsyncSocket
{
   if (0 != nErrorCode)
   {
      switch (nErrorCode)
      {
      case WSAEADDRINUSE:
         AfxMessageBox(_T("The specified address is already in use.\n"));
         break;
      case WSAEADDRNOTAVAIL:
         AfxMessageBox(_T("The specified address is not available from ")
                       _T("the local machine.\n"));
         break;
      case WSAEAFNOSUPPORT:
         AfxMessageBox(_T("Addresses in the specified family cannot be ")
                       _T("used with this socket.\n"));
         break;
      case WSAECONNREFUSED:
         AfxMessageBox(_T("The attempt to connect was forcefully rejected.\n"));
         break;
      case WSAEDESTADDRREQ:
         AfxMessageBox(_T("A destination address is required.\n"));
         break;
      case WSAEFAULT:
         AfxMessageBox(_T("The lpSockAddrLen argument is incorrect.\n"));
         break;
      case WSAEINVAL:
         AfxMessageBox(_T("The socket is already bound to an address.\n"));
         break;
      case WSAEISCONN:
         AfxMessageBox(_T("The socket is already connected.\n"));
         break;
      case WSAEMFILE:
         AfxMessageBox(_T("No more file descriptors are available.\n"));
         break;
      case WSAENETUNREACH:
         AfxMessageBox(_T("The network cannot be reached from this host ")
                       _T("at this time.\n"));
         break;
      case WSAENOBUFS:
         AfxMessageBox(_T("No buffer space is available. The socket ")
                       _T("cannot be connected.\n"));
         break;
      case WSAENOTCONN:
         AfxMessageBox(_T("The socket is not connected.\n"));
         break;
      case WSAENOTSOCK:
         AfxMessageBox(_T("The descriptor is a file, not a socket.\n"));
         break;
      case WSAETIMEDOUT:
         AfxMessageBox(_T("The attempt to connect timed out without ")
                       _T("establishing a connection. \n"));
         break;
      default:
         TCHAR szError[256];
         _stprintf_s(szError, _T("OnConnect error: %d"), nErrorCode);
         AfxMessageBox(szError);
         break;
      }
      AfxMessageBox(_T("Please close the application"));
   }
   CAsyncSocket::OnConnect(nErrorCode);
}

CAsyncSocket::OnOutOfBandData

送信ソケットに送信する帯域外データがあることを受信ソケットに通知するためにフレームワークによって呼び出されます。

virtual void OnOutOfBandData(int nErrorCode);

パラメーター

nErrorCode
ソケットの最新のエラー。 OnOutOfBandData メンバー関数には、次のエラー コードが適用されます。

  • 0 関数が正常に実行されました。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

解説

帯域外データは、 SOCK_STREAM型の接続されたソケットの各ペアに関連付けられている論理的に独立したチャネルです。 チャネルは通常、緊急データを送信するために使用されます。

MFC では帯域外データがサポートされていますが、クラス CAsyncSocket のユーザーは使用しないことをお勧めします。 そのようなデータを渡すためには 2 番目のソケットを作成する方が簡単です。 帯域外データの詳細については、「 Windows ソケット: ソケット通知」を参照してください。

CAsyncSocket::OnReceive

Receive メンバー関数を呼び出すことによって取得できるデータがバッファー内にあることをこのソケットに通知するためにフレームワークによって呼び出されます。

virtual void OnReceive(int nErrorCode);

パラメーター

nErrorCode
ソケットの最新のエラー。 OnReceive メンバー関数には、次のエラー コードが適用されます。

  • 0 関数が正常に実行されました。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

解説

詳細については、「Windows ソケット: ソケット通知」を参照してください。

void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket is
                                               // derived from CAsyncSocket
{
  static int i = 0;

  i++;

  TCHAR buff[4096];
  int nRead;
  nRead = Receive(buff, 4096);

  switch (nRead)
  {
  case 0:
    Close();
    break;
  case SOCKET_ERROR:
    if (GetLastError() != WSAEWOULDBLOCK)
    {
      AfxMessageBox(_T("Error occurred"));
      Close();
    }
    break;
  default:
    buff[nRead] = _T('\0'); //terminate the string
    CString szTemp(buff);
    m_strRecv += szTemp; // m_strRecv is a CString declared
                         // in CMyAsyncSocket
    if (szTemp.CompareNoCase(_T("bye")) == 0)
    {
      ShutDown();
      s_eventDone.SetEvent();
    }
  }
  CAsyncSocket::OnReceive(nErrorCode);
}

CAsyncSocket::OnSend

Send メンバー関数を呼び出してデータを送信できるようになったことをソケットに通知するためにフレームワークによって呼び出されます。

virtual void OnSend(int nErrorCode);

パラメーター

nErrorCode
ソケットの最新のエラー。 OnSend メンバー関数には、次のエラー コードが適用されます。

  • 0 関数が正常に実行されました。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

解説

詳細については、「Windows ソケット: ソケット通知」を参照してください。

// CMyAsyncSocket is derived from CAsyncSocket and defines the
// following variables:
//    CString  m_sendBuffer;   //for async send
//    int      m_nBytesSent;
//    int      m_nBytesBufferSize;
void CMyAsyncSocket::OnSend(int nErrorCode)
{
   while (m_nBytesSent < m_nBytesBufferSize)
   {
      int dwBytes;

      if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent,
                          m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)
      {
         if (GetLastError() == WSAEWOULDBLOCK)
         {
            break;
         }
         else
         {
            TCHAR szError[256];
            _stprintf_s(szError, _T("Server Socket failed to send: %d"),
                        GetLastError());
            Close();
            AfxMessageBox(szError);
         }
      }
      else
      {
         m_nBytesSent += dwBytes;
      }
   }

   if (m_nBytesSent == m_nBytesBufferSize)
   {
      m_nBytesSent = m_nBytesBufferSize = 0;
      m_sendBuffer = _T("");
   }

   CAsyncSocket::OnSend(nErrorCode);
}

CAsyncSocket::operator =

新しい値を CAsyncSocket オブジェクトに代入します。

void operator=(const CAsyncSocket& rSrc);

パラメーター

rSrc
既存の CAsyncSocket オブジェクトへの参照。

解説

既存の CAsyncSocket オブジェクトを別の CAsyncSocket オブジェクトにコピーするには、この関数を呼び出します。

CAsyncSocket::operator SOCKET

この演算子を使用して、CAsyncSocket オブジェクトのSOCKET ハンドルを取得します。

operator SOCKET() const;

戻り値

成功した場合は、 SOCKET オブジェクトのハンドル。それ以外の場合は NULL

解説

このハンドルを使用して、Windows API を直接呼び出すことができます。

CAsyncSocket::Receive

ソケットからデータを受信するには、このメンバー関数を呼び出します。

virtual int Receive(
    void* lpBuf,
    int nBufLen,
    int nFlags = 0);

パラメーター

lpBuf
受信データのバッファー。

nBufLen
lpBufの長さ (バイト単位)。

nFlags
呼び出しを行う方法を指定します。 この関数のセマンティクスは、ソケット オプションと nFlags パラメーターによって決まります。 後者は、次のいずれかの値を C++ ビットごとの OR 演算子 (|) と組み合わせることによって構築されます。

  • MSG_PEEK 受信データをピークします。 データはバッファーにコピーされますが、入力キューからは削除されません。

  • MSG_OOB 帯域外データを処理します。

戻り値

エラーが発生しなかった場合、 Receive は受信したバイト数を返します。 接続が閉じられている場合は、0 を返します。 それ以外の場合は、 SOCKET_ERROR の値が返され、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAENOTCONN ソケットが接続されていません。

  • WSAEINPROGRESS Windows ソケットのブロック操作が進行中です。

  • WSAENOTSOCK 記述子はソケットではありません。

  • WSAEOPNOTSUPPMSG_OOBが指定されましたが、ソケットがSOCK_STREAM型ではありません。

  • WSAESHUTDOWNソケットがシャットダウンされました。nHowを 0 または 2 に設定してShutDownが呼び出された後、ソケットでReceiveを呼び出すことはできません。

  • WSAEWOULDBLOCK ソケットは非ブロッキングとしてマークされ、 Receive 操作はブロックされます。

  • WSAEMSGSIZE データグラムが大きすぎて指定されたバッファーに収まりきれず、切り捨てられました。

  • WSAEINVAL ソケットが Bindにバインドされていません。

  • WSAECONNABORTED タイムアウトまたはその他の障害により、仮想回線が中止されました。

  • WSAECONNRESET リモート側で仮想回線がリセットされました。

解説

この関数は、接続されたストリームまたはデータグラム ソケットに使用され、受信データの読み取りに使用されます。

SOCK_STREAM型のソケットの場合、指定されたバッファーのサイズまで、現在使用可能な限り多くの情報が返されます。 ソケットが帯域外データ (ソケット オプション SO_OOBINLINE) のインライン受信用に構成されており、帯域外データが未読の場合は、帯域外データのみが返されます。 アプリケーションは、 IOCtlSIOCATMARK オプションまたは OnOutOfBandData を使用して、帯域外データを読み取る必要があるかどうかを判断できます。

データグラム ソケットの場合、最初にエンキューされたデータグラムから、指定されたバッファーのサイズまで、データが抽出されます。 データグラムが指定されたバッファーより大きい場合、バッファーはデータグラムの最初の部分でいっぱいになり、余分なデータは失われ、Receiveはエラー コードがWSAEMSGSIZEに設定されたSOCKET_ERRORの値を返します。 ソケットで使用できる受信データがない場合は、エラー コードが WSAEWOULDBLOCK に設定されたSOCKET_ERRORの値が返されます。 OnReceiveコールバック関数を使用して、より多くのデータがいつ到着するかを判断できます。

ソケットが SOCK_STREAM タイプで、リモート側が接続を正常にシャットダウンした場合、 Receive はすぐに 0 バイトを受信して完了します。 接続がリセットされた場合、 Receive はエラー WSAECONNRESETで失敗します。

Receive は、 CAsyncSocket::OnReceive が呼び出されるたびに 1 回だけ呼び出す必要があります。

CAsyncSocket::OnReceive の例を参照してください。

CAsyncSocket::ReceiveFrom

このメンバー関数を呼び出してデータグラムを受信し、ソース アドレスを SOCKADDR 構造体または rSocketAddress に格納します。

int ReceiveFrom(
    void* lpBuf,
    int nBufLen,
    CString& rSocketAddress,
    UINT& rSocketPort,
    int nFlags = 0);

int ReceiveFrom(
    void* lpBuf,
    int nBufLen,
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen,
    int nFlags = 0);

パラメーター

lpBuf
受信データのバッファー。

nBufLen
lpBufの長さ (バイト単位)。

rSocketAddress
ドット番号の IP アドレスを受け取る CString オブジェクトへの参照。

rSocketPort
ポートを格納する UINT への参照。

lpSockAddr
戻り時にソース アドレスを保持する SOCKADDR 構造体へのポインター。

lpSockAddrLen
lpSockAddrバイト単位のソース アドレスの長さを指すポインター。

nFlags
呼び出しを行う方法を指定します。 この関数のセマンティクスは、ソケット オプションと nFlags パラメーターによって決まります。 後者は、次のいずれかの値を C++ ビットごとの OR 演算子 (|) と組み合わせることによって構築されます。

  • MSG_PEEK 受信データをピークします。 データはバッファーにコピーされますが、入力キューからは削除されません。

  • MSG_OOB 帯域外データを処理します。

戻り値

エラーが発生しなかった場合、 ReceiveFrom は受信したバイト数を返します。 接続が閉じられている場合は、0 を返します。 それ以外の場合は、 SOCKET_ERROR の値が返され、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEFAULTlpSockAddrLen引数が無効です。lpSockAddr バッファーが小さすぎてピア アドレスに対応できませんでした。

  • WSAEINPROGRESS Windows ソケットのブロック操作が進行中です。

  • WSAEINVAL ソケットが Bindにバインドされていません。

  • WSAENOTCONN ソケットが接続されていません (SOCK_STREAM のみ)。

  • WSAENOTSOCK 記述子はソケットではありません。

  • WSAEOPNOTSUPPMSG_OOBが指定されましたが、ソケットがSOCK_STREAM型ではありません。

  • WSAESHUTDOWNソケットがシャットダウンされました。nHowを 0 または 2 に設定してShutDownが呼び出された後、ソケットでReceiveFromを呼び出すことはできません。

  • WSAEWOULDBLOCK ソケットは非ブロッキングとしてマークされ、 ReceiveFrom 操作はブロックされます。

  • WSAEMSGSIZE データグラムが大きすぎて指定されたバッファーに収まりきれず、切り捨てられました。

  • WSAECONNABORTED タイムアウトまたはその他の障害により、仮想回線が中止されました。

  • WSAECONNRESET リモート側で仮想回線がリセットされました。

解説

この関数は、(接続されている可能性がある) ソケット上の受信データを読み取り、データの送信元のアドレスをキャプチャするために使用されます。

IPv6 アドレスを処理するには、 CAsyncSocket::ReceiveFromExを使用します。

SOCK_STREAM型のソケットの場合、指定されたバッファーのサイズまで、現在使用可能な限り多くの情報が返されます。 ソケットが帯域外データ (ソケット オプション SO_OOBINLINE) のインライン受信用に構成されており、帯域外データが未読の場合は、帯域外データのみが返されます。 アプリケーションは、 IOCtlSIOCATMARK オプションまたは OnOutOfBandData を使用して、帯域外データを読み取る必要があるかどうかを判断できます。 lpSockAddrおよびlpSockAddrLenパラメーターは、SOCK_STREAM ソケットでは無視されます。

データグラム ソケットの場合、最初にエンキューされたデータグラムから、指定されたバッファーのサイズまで、データが抽出されます。 データグラムが指定されたバッファーより大きい場合、バッファーはメッセージの最初の部分でいっぱいになり、余分なデータは失われ、ReceiveFromはエラー コードがWSAEMSGSIZEに設定されたSOCKET_ERRORの値を返します。

lpSockAddrが 0 以外で、ソケットが SOCK_DGRAM 型の場合、データを送信したソケットのネットワーク アドレスは、対応するSOCKADDR構造体にコピーされます。 lpSockAddrLenが指す値は、この構造体のサイズに初期化され、戻り時に変更され、そこに格納されているアドレスの実際のサイズを示します。 ソケットで受信データが使用できない場合、 ReceiveFrom 呼び出しは、ソケットが非ブロッキングでない限り、データの到着を待機します。 この場合、エラー コードが WSAEWOULDBLOCK に設定されたSOCKET_ERRORの値が返されます。 OnReceiveコールバックを使用して、より多くのデータがいつ到着するかを判断できます。

ソケットが SOCK_STREAM タイプで、リモート側が接続を正常にシャットダウンした場合、 ReceiveFrom はすぐに 0 バイトを受信して完了します。

CAsyncSocket::ReceiveFromEx

このメンバー関数を呼び出してデータグラムを受信し、ソース アドレスを SOCKADDR 構造体または rSocketAddress に格納します (IPv6 アドレスを処理します)。

int ReceiveFromEx(
    void* lpBuf,
    int nBufLen,
    CString& rSocketAddress,
    UINT& rSocketPort,
    int nFlags = 0);

パラメーター

lpBuf
受信データのバッファー。

nBufLen
lpBufの長さ (バイト単位)。

rSocketAddress
ドット番号の IP アドレスを受け取る CString オブジェクトへの参照。

rSocketPort
ポートを格納する UINT への参照。

nFlags
呼び出しを行う方法を指定します。 この関数のセマンティクスは、ソケット オプションと nFlags パラメーターによって決まります。 後者は、次のいずれかの値を C++ ビットごとの OR 演算子 (|) と組み合わせることによって構築されます。

  • MSG_PEEK 受信データをピークします。 データはバッファーにコピーされますが、入力キューからは削除されません。

  • MSG_OOB 帯域外データを処理します。

戻り値

エラーが発生しなかった場合、 ReceiveFromEx は受信したバイト数を返します。 接続が閉じられている場合は、0 を返します。 それ以外の場合は、 SOCKET_ERROR の値が返され、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEFAULTlpSockAddrLen引数が無効です。lpSockAddr バッファーが小さすぎてピア アドレスに対応できませんでした。

  • WSAEINPROGRESS Windows ソケットのブロック操作が進行中です。

  • WSAEINVAL ソケットが Bindにバインドされていません。

  • WSAENOTCONN ソケットが接続されていません (SOCK_STREAM のみ)。

  • WSAENOTSOCK 記述子はソケットではありません。

  • WSAEOPNOTSUPPMSG_OOBが指定されましたが、ソケットがSOCK_STREAM型ではありません。

  • WSAESHUTDOWNソケットがシャットダウンされました。nHowを 0 または 2 に設定してShutDownが呼び出された後、ソケットでReceiveFromExを呼び出すことはできません。

  • WSAEWOULDBLOCK ソケットは非ブロッキングとしてマークされ、 ReceiveFromEx 操作はブロックされます。

  • WSAEMSGSIZE データグラムが大きすぎて指定されたバッファーに収まりきれず、切り捨てられました。

  • WSAECONNABORTED タイムアウトまたはその他の障害により、仮想回線が中止されました。

  • WSAECONNRESET リモート側で仮想回線がリセットされました。

解説

この関数は、(接続されている可能性がある) ソケット上の受信データを読み取り、データの送信元のアドレスをキャプチャするために使用されます。

この関数は、IPv6 アドレスと古いプロトコルを処理する点を除き、 CAsyncSocket::ReceiveFrom と同じです。

SOCK_STREAM型のソケットの場合、指定されたバッファーのサイズまで、現在使用可能な限り多くの情報が返されます。 ソケットが帯域外データ (ソケット オプション SO_OOBINLINE) のインライン受信用に構成されており、帯域外データが未読の場合は、帯域外データのみが返されます。 アプリケーションは、 IOCtlSIOCATMARK オプションまたは OnOutOfBandData を使用して、帯域外データを読み取る必要があるかどうかを判断できます。 lpSockAddrおよびlpSockAddrLenパラメーターは、SOCK_STREAM ソケットでは無視されます。

データグラム ソケットの場合、最初にエンキューされたデータグラムから、指定されたバッファーのサイズまで、データが抽出されます。 データグラムが指定されたバッファーより大きい場合、バッファーはメッセージの最初の部分でいっぱいになり、余分なデータは失われ、ReceiveFromExはエラー コードがWSAEMSGSIZEに設定されたSOCKET_ERRORの値を返します。

lpSockAddrが 0 以外で、ソケットが SOCK_DGRAM 型の場合、データを送信したソケットのネットワーク アドレスは、対応するSOCKADDR構造体にコピーされます。 lpSockAddrLenが指す値は、この構造体のサイズに初期化され、戻り時に変更され、そこに格納されているアドレスの実際のサイズを示します。 ソケットで受信データが使用できない場合、 ReceiveFromEx 呼び出しは、ソケットが非ブロッキングでない限り、データの到着を待機します。 この場合、エラー コードが WSAEWOULDBLOCK に設定されたSOCKET_ERRORの値が返されます。 OnReceiveコールバックを使用して、より多くのデータがいつ到着するかを判断できます。

ソケットが SOCK_STREAM タイプで、リモート側が接続を正常にシャットダウンした場合、 ReceiveFromEx はすぐに 0 バイトを受信して完了します。

CAsyncSocket::Send

接続されているソケットでデータを送信するには、このメンバー関数を呼び出します。

virtual int Send(
    const void* lpBuf,
    int nBufLen,
    int nFlags = 0);

パラメーター

lpBuf
送信するデータを格納しているバッファー。

nBufLen
データの長さ (バイト単位) lpBuf

nFlags
呼び出しを行う方法を指定します。 この関数のセマンティクスは、ソケット オプションと nFlags パラメーターによって決まります。 後者は、次のいずれかの値を C++ ビットごとの OR 演算子 (|) と組み合わせることによって構築されます。

  • MSG_DONTROUTE データをルーティングの対象にしないことを指定します。 Windows ソケット サプライヤーは、このフラグを無視することを選択できます。

  • MSG_OOB 帯域外データの送信 (SOCK_STREAM のみ)。

戻り値

エラーが発生しなかった場合、 Send は送信された文字数の合計を返します。 (これは、 nBufLenで示される数より小さい場合があることに注意してください)。それ以外の場合は、 SOCKET_ERROR の値が返され、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEACCES 要求されたアドレスはブロードキャスト アドレスですが、適切なフラグが設定されていませんでした。

  • WSAEINPROGRESS Windows ソケットのブロック操作が進行中です。

  • WSAEFAULTlpBuf引数は、ユーザー・アドレス・スペースの有効な部分にありません。

  • WSAENETRESET Windows ソケットの実装によって接続が削除されたため、接続をリセットする必要があります。

  • WSAENOBUFS Windows ソケットの実装は、バッファーのデッドロックを報告します。

  • WSAENOTCONN ソケットが接続されていません。

  • WSAENOTSOCK 記述子はソケットではありません。

  • WSAEOPNOTSUPPMSG_OOBが指定されましたが、ソケットがSOCK_STREAM型ではありません。

  • WSAESHUTDOWNソケットがシャットダウンされました。ShutDownが 1 または 2 に設定nHow呼び出された後、ソケットでSendを呼び出すことはできません。

  • WSAEWOULDBLOCK ソケットは非ブロッキングとしてマークされ、要求された操作はブロックされます。

  • WSAEMSGSIZE ソケットは SOCK_DGRAM型であり、データグラムは Windows ソケットの実装でサポートされている最大値を超えています。

  • WSAEINVAL ソケットが Bindにバインドされていません。

  • WSAECONNABORTED タイムアウトまたはその他の障害により、仮想回線が中止されました。

  • WSAECONNRESET リモート側で仮想回線がリセットされました。

解説

Send は、接続されたストリームまたはデータグラム ソケットに送信データを書き込むのに使用されます。 データグラム ソケットの場合は、基になるサブネットの最大 IP パケット サイズを超えないように注意する必要があります。これは、AfxSocketInitによって返されるWSADATA構造体のiMaxUdpDg要素によって与えられます。 データが長すぎて基になるプロトコルをアトミックに通過できない場合、エラー WSAEMSGSIZEGetLastError経由で返され、データは送信されません。

データグラム ソケットの場合、 Send が正常に完了しても、データが正常に配信されたことは示されないことに注意してください。

SOCK_STREAM型のCAsyncSocketオブジェクトでは、ローカル ホストと外部ホストの両方でのバッファーの可用性に応じて、書き込まれるバイト数を 1 から要求された長さの間にすることができます。

CAsyncSocket::OnSend の例を参照してください。

CAsyncSocket::SendTo

特定の宛先にデータを送信するには、このメンバー関数を呼び出します。

int SendTo(
    const void* lpBuf,
    int nBufLen,
    UINT nHostPort,
    LPCTSTR lpszHostAddress = NULL,
    int nFlags = 0);

int SendTo(
    const void* lpBuf,
    int nBufLen,
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen,
    int nFlags = 0);

パラメーター

lpBuf
送信するデータを格納しているバッファー。

nBufLen
データの長さ (バイト単位) lpBuf

nHostPort
ソケット アプリケーションを識別するポート。

lpszHostAddress
このオブジェクトが接続されているソケットのネットワーク アドレス: "ftp.microsoft.com" などのマシン名、または "128.56.22.8" などの点線の番号。

nFlags
呼び出しを行う方法を指定します。 この関数のセマンティクスは、ソケット オプションと nFlags パラメーターによって決まります。 後者は、次のいずれかの値を C++ ビットごとの OR 演算子 (|) と組み合わせることによって構築されます。

  • MSG_DONTROUTE データをルーティングの対象にしないことを指定します。 Windows ソケット サプライヤーは、このフラグを無視することを選択できます。

  • MSG_OOB 帯域外データの送信 (SOCK_STREAM のみ)。

lpSockAddr
ターゲット ソケットのアドレスを含む SOCKADDR 構造体へのポインター。

nSockAddrLen
アドレスの長さ (バイト単位) lpSockAddr

戻り値

エラーが発生しなかった場合、 SendTo は送信された文字数の合計を返します。 (これは、 nBufLenで示される数より小さい場合があることに注意してください)。それ以外の場合は、 SOCKET_ERROR の値が返され、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEACCES 要求されたアドレスはブロードキャスト アドレスですが、適切なフラグが設定されていませんでした。

  • WSAEINPROGRESS Windows ソケットのブロック操作が進行中です。

  • WSAEFAULTlpBufまたはlpSockAddrパラメーターがユーザー アドレス空間の一部ではないか、lpSockAddr引数が小さすぎます (SOCKADDR構造体のサイズより小さい)。

  • WSAEINVAL ホスト名が無効です。

  • WSAENETRESET Windows ソケットの実装によって接続が削除されたため、接続をリセットする必要があります。

  • WSAENOBUFS Windows ソケットの実装は、バッファーのデッドロックを報告します。

  • WSAENOTCONN ソケットが接続されていません (SOCK_STREAM のみ)。

  • WSAENOTSOCK 記述子はソケットではありません。

  • WSAEOPNOTSUPPMSG_OOBが指定されましたが、ソケットがSOCK_STREAM型ではありません。

  • WSAESHUTDOWNソケットがシャットダウンされました。ShutDownが 1 または 2 に設定nHow呼び出された後、ソケットでSendToを呼び出すことはできません。

  • WSAEWOULDBLOCK ソケットは非ブロッキングとしてマークされ、要求された操作はブロックされます。

  • WSAEMSGSIZE ソケットは SOCK_DGRAM型であり、データグラムは Windows ソケットの実装でサポートされている最大値を超えています。

  • WSAECONNABORTED タイムアウトまたはその他の障害により、仮想回線が中止されました。

  • WSAECONNRESET リモート側で仮想回線がリセットされました。

  • WSAEADDRNOTAVAIL 指定されたアドレスは、ローカル コンピューターから使用できません。

  • WSAEAFNOSUPPORT 指定されたファミリ内のアドレスは、このソケットでは使用できません。

  • WSAEDESTADDRREQ 宛先アドレスが必要です。

  • WSAENETUNREACH 現時点では、このホストからネットワークにアクセスできません。

解説

SendTo は、データグラムまたはストリーム ソケットで使用され、ソケットに送信データを書き込むのに使用されます。 データグラム ソケットの場合は、基になるサブネットの最大 IP パケット サイズを超えないように注意する必要があります。これは、AfxSocketInitによって入力されたWSADATA構造体のiMaxUdpDg要素によって提供されます。 データが長すぎて基になるプロトコルをアトミックに通過できない場合は、エラー WSAEMSGSIZE が返され、データは送信されません。

SendToが正常に完了しても、データが正常に配信されたことは示されません。

SendToは、lpSockAddr パラメーターによって識別される特定のソケットにデータグラムを送信するために、SOCK_DGRAM ソケットでのみ使用されます。

ブロードキャストを送信するには ( SOCK_DGRAM のみ)、 lpSockAddr パラメーターのアドレスは、特殊な IP アドレス INADDR_BROADCAST (Windows ソケット ヘッダー ファイル WINSOCK.Hで定義) と目的のポート番号を使用して構築する必要があります。 または、 lpszHostAddress パラメーターが NULLされている場合、ソケットはブロードキャスト用に構成されます。 通常、ブロードキャスト データグラムが断片化が発生する可能性があるサイズを超えることはできません。つまり、データグラムのデータ部分 (ヘッダーを除く) は 512 バイトを超えないようにします。

IPv6 アドレスを処理するには、 CAsyncSocket::SendToExを使用します。

CAsyncSocket::SendToEx

このメンバー関数を呼び出して、特定の宛先にデータを送信します (IPv6 アドレスを処理します)。

int SendToEx(
    const void* lpBuf,
    int nBufLen,
    UINT nHostPort,
    LPCTSTR lpszHostAddress = NULL,
    int nFlags = 0);

パラメーター

lpBuf
送信するデータを格納しているバッファー。

nBufLen
データの長さ (バイト単位) lpBuf

nHostPort
ソケット アプリケーションを識別するポート。

lpszHostAddress
このオブジェクトが接続されているソケットのネットワーク アドレス: "ftp.microsoft.com" などのマシン名、または "128.56.22.8" などの点線の番号。

nFlags
呼び出しを行う方法を指定します。 この関数のセマンティクスは、ソケット オプションと nFlags パラメーターによって決まります。 後者は、次のいずれかの値を C++ ビットごとの OR 演算子 (|) と組み合わせることによって構築されます。

  • MSG_DONTROUTE データをルーティングの対象にしないことを指定します。 Windows ソケット サプライヤーは、このフラグを無視することを選択できます。

  • MSG_OOB 帯域外データの送信 (SOCK_STREAM のみ)。

戻り値

エラーが発生しなかった場合、 SendToEx は送信された文字数の合計を返します。 (これは、 nBufLenで示される数より小さい場合があることに注意してください)。それ以外の場合は、 SOCKET_ERROR の値が返され、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEACCES 要求されたアドレスはブロードキャスト アドレスですが、適切なフラグが設定されていませんでした。

  • WSAEINPROGRESS Windows ソケットのブロック操作が進行中です。

  • WSAEFAULTlpBufまたはlpSockAddrパラメーターがユーザー アドレス空間の一部ではないか、lpSockAddr引数が小さすぎます (SOCKADDR構造体のサイズより小さい)。

  • WSAEINVAL ホスト名が無効です。

  • WSAENETRESET Windows ソケットの実装によって接続が削除されたため、接続をリセットする必要があります。

  • WSAENOBUFS Windows ソケットの実装は、バッファーのデッドロックを報告します。

  • WSAENOTCONN ソケットが接続されていません (SOCK_STREAM のみ)。

  • WSAENOTSOCK 記述子はソケットではありません。

  • WSAEOPNOTSUPPMSG_OOBが指定されましたが、ソケットがSOCK_STREAM型ではありません。

  • WSAESHUTDOWNソケットがシャットダウンされました。ShutDownが 1 または 2 に設定nHow呼び出された後、ソケットでSendToExを呼び出すことはできません。

  • WSAEWOULDBLOCK ソケットは非ブロッキングとしてマークされ、要求された操作はブロックされます。

  • WSAEMSGSIZE ソケットは SOCK_DGRAM型であり、データグラムは Windows ソケットの実装でサポートされている最大値を超えています。

  • WSAECONNABORTED タイムアウトまたはその他の障害により、仮想回線が中止されました。

  • WSAECONNRESET リモート側で仮想回線がリセットされました。

  • WSAEADDRNOTAVAIL 指定されたアドレスは、ローカル コンピューターから使用できません。

  • WSAEAFNOSUPPORT 指定されたファミリ内のアドレスは、このソケットでは使用できません。

  • WSAEDESTADDRREQ 宛先アドレスが必要です。

  • WSAENETUNREACH 現時点では、このホストからネットワークにアクセスできません。

解説

この方法は、IPv6 アドレスと古いプロトコルを処理する点を除き、 CAsyncSocket::SendTo と同じです。

SendToEx は、データグラムまたはストリーム ソケットで使用され、ソケットに送信データを書き込むのに使用されます。 データグラム ソケットの場合は、基になるサブネットの最大 IP パケット サイズを超えないように注意する必要があります。これは、AfxSocketInitによって入力されたWSADATA構造体のiMaxUdpDg要素によって提供されます。 データが長すぎて基になるプロトコルをアトミックに通過できない場合は、エラー WSAEMSGSIZE が返され、データは送信されません。

SendToExが正常に完了しても、データが正常に配信されたことは示されません。

SendToExは、lpSockAddr パラメーターによって識別される特定のソケットにデータグラムを送信するために、SOCK_DGRAM ソケットでのみ使用されます。

ブロードキャストを送信するには ( SOCK_DGRAM のみ)、 lpSockAddr パラメーターのアドレスは、特殊な IP アドレス INADDR_BROADCAST (Windows ソケット ヘッダー ファイル WINSOCK.Hで定義) と目的のポート番号を使用して構築する必要があります。 または、 lpszHostAddress パラメーターが NULLされている場合、ソケットはブロードキャスト用に構成されます。 通常、ブロードキャスト データグラムが断片化が発生する可能性があるサイズを超えることはできません。つまり、データグラムのデータ部分 (ヘッダーを除く) は 512 バイトを超えないようにします。

CAsyncSocket::SetSockOpt

ソケット オプションを設定するには、このメンバー関数を呼び出します。

BOOL SetSockOpt(
    int nOptionName,
    const void* lpOptionValue,
    int nOptionLen,
    int nLevel = SOL_SOCKET);

パラメーター

nOptionName
値を設定するソケット オプション。

lpOptionValue
要求されたオプションの値が指定されるバッファーへのポインター。

nOptionLen
lpOptionValue バッファーのサイズ (バイト単位)。

nLevel
オプションが定義されているレベル。サポートされているレベルは、 SOL_SOCKETIPPROTO_TCPのみです。

戻り値

関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEFAULTlpOptionValueは、プロセス・アドレス・スペースの有効な部分にありません。

  • WSAEINPROGRESS Windows ソケットのブロック操作が進行中です。

  • WSAEINVALnLevelが無効であるか、lpOptionValueの情報が無効です。

  • WSAENETRESETSO_KEEPALIVEが設定されていると、接続がタイムアウトしました。

  • WSAENOPROTOOPT このオプションは不明またはサポートされていません。 特に、 SO_BROADCAST は型 SOCK_STREAMのソケットではサポートされていませんが、 SO_DONTLINGERSO_KEEPALIVESO_LINGER、および SO_OOBINLINE は、 SOCK_DGRAM型のソケットではサポートされていません。

  • WSAENOTCONNSO_KEEPALIVEが設定されると、接続がリセットされました。

  • WSAENOTSOCK 記述子はソケットではありません。

解説

SetSockOpt は、任意の型のソケットに関連付けられているソケット オプションの現在の値を任意の状態で設定します。 オプションは複数のプロトコル レベルで存在できますが、この仕様では、最上位の "ソケット" レベルに存在するオプションのみを定義します。 オプションは、通常のデータ ストリームで優先データを受信するかどうか、ブロードキャスト メッセージをソケットで送信できるかどうかなど、ソケット操作に影響します。

ソケット オプションには、機能または動作を有効または無効にするブール型オプションと、整数値または構造体を必要とするオプションの 2 種類があります。 ブール値オプションを有効にするには、 lpOptionValue は 0 以外の整数を指します。 このオプションを無効にするには、 lpOptionValue は 0 の整数を指します。 nOptionLen は、ブール型のオプションの sizeof(BOOL) と等しい必要があります。 その他のオプションの場合、 lpOptionValue はオプションの目的の値を含む整数または構造体を指し、 nOptionLen は整数または構造体の長さです。

SO_LINGER は、ソケットで未入データがキューに入れられ、 Close 関数が呼び出されてソケットを閉じるときに実行されるアクションを制御します。

既定では、ソケットは既に使用されているローカル アドレスにバインドできません ( Bind参照)。 ただし、場合によっては、この方法でアドレスを "再利用" することが望ましい場合があります。 すべての接続はローカル アドレスとリモート アドレスの組み合わせによって一意に識別されるため、リモート アドレスが異なる限り、2 つのソケットを同じローカル アドレスにバインドしても問題はありません。

必要なアドレスが既に別のソケットで使用されているため、ソケットのBind呼び出しを許可しないことを Windows ソケットの実装に通知するには、アプリケーションは、Bind呼び出しを発行する前に、ソケットのSO_REUSEADDRソケット オプションを設定する必要があります。 オプションは、 Bind 呼び出し時にのみ解釈されることに注意してください。したがって、既存のアドレスにバインドされていないソケットにオプションを設定することは不要です (ただし無害です)。また、 Bind 呼び出し後にオプションを設定またはリセットしても、このソケットやその他のソケットには影響しません。

アプリケーションは、 SO_KEEPALIVE ソケット オプションをオンにすることで、Windows ソケットの実装で伝送制御プロトコル (TCP) 接続で "キープアライブ" パケットの使用を有効にすることを要求できます。 Windows ソケットの実装では、キープアライブの使用をサポートする必要はありません。有効な場合、正確なセマンティクスは実装固有ですが、RFC 1122 のセクション 4.2.3.6"インターネット ホストの要件 — 通信層" に準拠する必要があります。"キープアライブ" の結果として接続が切断された場合、エラー コード WSAENETRESET はソケットで進行中のすべての呼び出しに返され、後続の呼び出しは WSAENOTCONNで失敗します。

TCP_NODELAY オプションを使用すると、Nagle アルゴリズムが無効になります。 Nagle アルゴリズムは、フル サイズのパケットを送信できるようになるまで未確認の送信データをバッファリングすることで、ホストによって送信される小さなパケットの数を減らすために使用されます。 ただし、一部のアプリケーションでは、このアルゴリズムによってパフォーマンスが低下する可能性があり、 TCP_NODELAY を使用して無効にすることができます。 アプリケーション ライターは、TCP_NODELAYの設定がネットワーク パフォーマンスに大きな悪影響を及ぼす可能性があるため、その影響が十分に理解され、必要でない限り、TCP_NODELAYを設定しないでください。 TCP_NODELAY は、レベル IPPROTO_TCPを使用する唯一のサポートされているソケット オプションです。他のすべてのオプションでは、レベル SOL_SOCKETを使用します。

SO_DEBUG オプションがアプリケーションによって設定されている場合、Windows ソケットの一部の実装では出力デバッグ情報が提供されます。

SetSockOptでは、次のオプションがサポートされています。 Type は、 lpOptionValueによってアドレス指定されたデータの型を識別します。

Type 説明
SO_BROADCAST BOOL ソケットでのブロードキャスト メッセージの送信を許可します。
SO_DEBUG BOOL デバッグ情報を記録します。
SO_DONTLINGER BOOL 送信されていないデータの送信を待機している Close をブロックしないでください。 このオプションを設定することは、l_onoffを 0 に設定したSO_LINGERを設定することと同じです。
SO_DONTROUTE BOOL ルーティングしない: インターフェイスに直接送信します。
SO_KEEPALIVE BOOL キープアライブを送信します。
SO_LINGER struct LINGER Close データが存在する場合は残ります。
SO_OOBINLINE BOOL 通常のデータ ストリームで帯域外データを受信します。
SO_RCVBUF int 受信のバッファー サイズを指定します。
SO_REUSEADDR BOOL ソケットが既に使用されているアドレスにバインドされるようにします。 ( を参照してくださいバインド.)
SO_SNDBUF int 送信のバッファー サイズを指定します。
TCP_NODELAY BOOL 送信結合用の Nagle アルゴリズムを無効にします。

SetSockOptでサポートされていないバークレイ ソフトウェアディストリビューション (BSD) オプションは次のとおりです。

Type 説明
SO_ACCEPTCONN BOOL ソケットがリッスンしています
SO_ERROR int エラーの状態を取得し、クリアします。
SO_RCVLOWAT int 低いウォーターマークを受け取ります。
SO_RCVTIMEO int 受信タイムアウト
SO_SNDLOWAT int 低いウォーター マークを送信します。
SO_SNDTIMEO int 送信タイムアウト。
SO_TYPE int ソケットの種類。
IP_OPTIONS IP ヘッダーのオプション フィールドを設定します。

CAsyncSocket::ShutDown

このメンバー関数を呼び出して、ソケットでの送信、受信、またはその両方を無効にします。

BOOL ShutDown(int nHow = sends);

パラメーター

nHow
次の列挙値を使用して、許可されなくなった操作の種類を示すフラグ。

  • receives = 0

  • sends = 1

  • both = 2

戻り値

関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastErrorを呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。

  • WSANOTINITIALISED この API を使用する前に、正常な AfxSocketInit が発生する必要があります。

  • WSAENETDOWN Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。

  • WSAEINVALnHowが無効です。

  • WSAEINPROGRESS Windows ソケットのブロック操作が進行中です。

  • WSAENOTCONN ソケットが接続されていません (SOCK_STREAM のみ)。

  • WSAENOTSOCK 記述子はソケットではありません。

解説

ShutDown は、受信、伝送、またはその両方を無効にするために、すべてのタイプのソケットで使用されます。 nHowが 0 の場合、ソケットでの後続の受信は許可されません。 これは、下位のプロトコル レイヤーには影響しません。

伝送制御プロトコル (TCP) の場合、TCP ウィンドウは変更されず、ウィンドウが使い果たされるまで受信データは受け入れられます (ただし、確認されません)。 ユーザー データグラム プロトコル (UDP) の場合、受信データグラムが受け入れられ、キューに入れられます。 ICMP エラー パケットは生成されません。 nHowが 1 の場合、後続の送信は許可されません。 TCP ソケットの場合、FIN が送信されます。 nHowを 2 に設定すると、上記のように送受信の両方が無効になります。

ShutDownはソケットを閉じず、ソケットに接続されているリソースは、Closeが呼び出されるまで解放されないことに注意してください。 アプリケーションは、シャットダウン後にソケットを再利用できることに依存しないようにする必要があります。 特に、このようなソケットでの Connect の使用をサポートするために、Windows ソケットの実装は必要ありません。

CAsyncSocket::OnReceive の例を参照してください。

CASyncSocket::Socket

ソケット ハンドルを割り当てます。

BOOL Socket(
    int nSocketType = SOCK_STREAM,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    int nProtocolType = 0,
    int nAddressFormat = PF_INET);

パラメーター

nSocketType
SOCK_STREAMまたはSOCK_DGRAMを指定します。

lEvent
アプリケーションが関心を持つネットワーク イベントの組み合わせを指定するビットマスク。

  • FD_READ: 読み取り準備の通知を受け取りたい。

  • FD_WRITE: 書き込み準備の通知を受け取りたい。

  • FD_OOB: 帯域外データの到着通知を受け取りたい。

  • FD_ACCEPT: 受信接続の通知を受信する必要があります。

  • FD_CONNECT: 完了した接続の通知を受け取りたい。

  • FD_CLOSE:ソケットクロージャの通知を受け取りたい。

nProtocolType
指定されたアドレス ファミリに固有のソケットで使用されるプロトコル。

nAddressFormat
アドレス ファミリの仕様。

戻り値

正常に終了した場合は、TRUE を返します。それ以外の場合は、FALSE を返します。

解説

このメソッドは、ソケット ハンドルを割り当てます。 ソケットを指定したアドレスにバインドするために CAsyncSocket::Bind を呼び出さないため、後で Bind を呼び出して、指定したアドレスにソケットをバインドする必要があります。 CAsyncSocket::SetSockOptを使用して、バインドする前にソケット オプションを設定できます。

関連項目

CObject クラス
階層図
CSocket クラス
CSocketFile クラス