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 この演算子を使用して、オブジェクトの SOCKET ハンドルを CAsyncSocket 取得します。

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

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

解説

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

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

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

Note

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

詳細については、「 Windows ソケット: クラス CAsyncSocket と関連記事の使用」および 「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 正確な形式は、ソケットの作成時に確立されたアドレス ファミリによって決まります。 等しい場合やlpSockAddrLen等しいNULL場合lpSockAddr、受け入れられたソケットのリモート アドレスに関する情報は返されません。

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

戻り値

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

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

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

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

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

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

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

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

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

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

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

解説

このルーチンは、保留中の接続のキュー内の最初の接続を抽出し、このソケットと同じプロパティを持つ新しいソケットを作成し、それに rConnectedSocket接続します。 キューに保留中の接続がない場合は、0 を返しGetLastErrorAcceptエラーを返します。 受け入れられたソケット (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

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

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 指定したアドレスは既に使用されています。 (.) の下のソケット オプションをSO_REUSEADDRSetSockOpt参照してください。

  • 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場合はCSocketClose、セマンティクスはソケット オプション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 宛先アドレスが必要です。

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

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

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

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

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

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

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

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

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

解説

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

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

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

CAsyncSocket::Create

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

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 指定されたソケットの種類は、このアドレス ファミリではサポートされていません。

解説

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

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

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

    Note

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

重要

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

ストリーム ソケットとデータグラム ソケットの詳細については、「Windows ソケット: 背景と Windows ソケット: ポートとソケット アドレスWindows ソケット 2 API」の記事を参照してください。

CAsyncSocket::CreateEx

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

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

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

パラメーター

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

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

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

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

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

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

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

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

戻り値

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

解説

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

CAsyncSocket::Detach

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

SOCKET Detach();

CAsyncSocket::FromHandle

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

static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);

パラメーター

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

戻り値

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

解説

ハンドルが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
ドット番号の CString IP アドレスを受け取るオブジェクトへの参照。

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

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

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

戻り値

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

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

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

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

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

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

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

解説

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

CAsyncSocket::GetPeerNameEx

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

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

パラメーター

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

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

戻り値

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

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

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

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

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

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

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

解説

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

CAsyncSocket::GetSockName

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

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

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

パラメーター

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

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

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

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

戻り値

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

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

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

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

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

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

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

解説

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

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

CAsyncSocket::GetSockNameEx

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

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

パラメーター

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

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

戻り値

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

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

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

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

  • 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 または an intのサイズになります。 「解説」セクションのオプションとそのサイズの一覧を参照してください。

lpOptionLen
バッファーのサイズをバイト単位で指す lpOptionValue ポインター。

nLevel
オプションが定義されているレベル。唯一サポートされているレベルは、 SOL_SOCKETIPPROTO_TCP.

戻り値

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

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

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

  • WSAEFAULT 引数が lpOptionLen 無効です。

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

  • WSAENOPROTOOPT このオプションは不明またはサポートされていません。 特に、 SO_BROADCASTSOCK_STREAMのソケットではサポートされていません。一方 SO_ACCEPTCONN、, SO_DONTLINGER, SO_KEEPALIVE, SO_LINGERは、 SO_OOBINLINESOCK_DGRAMのソケットではサポートされていません。

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

解説

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

次のオプションがサポートされています GetSockOpt。 型は、アドレス指定されたデータの型を lpOptionValue識別します。 このオプションはレベルを使用しIPPROTO_TCP、他のすべてのオプションはTCP_NODELAYレベルを使用します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 アルゴリズムを無効にします。

Barke Software Distribution (BSD) オプションはサポートされていません GetSockOpt

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

サポートされていないオプションを使用して呼び出 GetSockOpt すと、エラー コード WSAENOPROTOOPT が返されます GetLastError

CAsyncSocket::IOCtl

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

BOOL IOCtl(
    long lCommand,
    DWORD* lpArgument);

パラメーター

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

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

戻り値

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

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

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

  • WSAEINVALlCommand が有効なコマンドではないか lpArgument 、または 、または指定されたソケットの型にコマンドが適用されない場合に使用できるパラメーター lCommandではありません。

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

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

解説

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

  • FIONBIO ソケットで非ブロッキング モードを有効または無効にします。 このパラメーターは lpArgumentDWORD非ブロッキング モードを有効にする場合は 0 以外、無効にする場合は 0 を指します。 ソケットに対して発行されている場合 AsyncSelect 、ソケットをブロッキング モードに戻すために使用 IOCtl しようとすると失敗 WSAEINVALします。 ソケットをブロッキング モードに戻してエラーをWSAEINVAL回避するには、最初に 0 のパラメーターを指定して呼び出し、次に呼び出IOCtlAsyncSelectlEventして無効にするAsyncSelect必要があります。

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

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

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

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 宛先アドレスが必要です。

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

  • 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

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

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ソケットがシャットダウンされました。0 または 2 に設定して呼び出された後ShutDownにソケットをnHow呼びReceive出すことはできません。

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

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

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

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

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

解説

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

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

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

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

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

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
ドット番号の CString IP アドレスを受け取るオブジェクトへの参照。

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

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

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

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

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

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

戻り値

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

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

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

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

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

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

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

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

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

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

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

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

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

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

解説

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

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

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

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

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

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

CAsyncSocket::ReceiveFromEx

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

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

パラメーター

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

nBufLen
バイト単位の lpBuf 長さ。

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

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

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

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

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

戻り値

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

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

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

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

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

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

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

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

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

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

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

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

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

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

解説

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

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

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

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

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

ソケットがタイプ SOCK_STREAM で、リモート側が接続を正常にシャットダウンした場合、a 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 ソケットのブロック操作が進行中です。

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

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

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

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

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

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

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

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

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

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

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

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

解説

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

データグラム ソケットの場合、a が正常に完了 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ソケットがシャットダウンされました。1 または 2 に設定して呼び出された後ShutDown、ソケットでnHow呼びSendTo出すことはできません。

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

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

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

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

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

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

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

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

解説

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

a の正常な完了 SendTo は、データが正常に配信されたことを示すものではありません。

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

ブロードキャストを (SOCK_DGRAMのみ) 送信するには、パラメーター内のlpSockAddrアドレスを、(Windows ソケット ヘッダー ファイルWINSOCK.Hで定義されている) 特殊な IP アドレスINADDR_BROADCASTと目的のポート番号を使用して構築する必要があります。 または、パラメーターが指定されている 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ソケットがシャットダウンされました。1 または 2 に設定して呼び出された後ShutDown、ソケットでnHow呼びSendToEx出すことはできません。

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

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

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

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

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

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

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

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

解説

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

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

a の正常な完了 SendToEx は、データが正常に配信されたことを示すものではありません。

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

ブロードキャストを (SOCK_DGRAMのみ) 送信するには、パラメーター内のlpSockAddrアドレスを、(Windows ソケット ヘッダー ファイルWINSOCK.Hで定義されている) 特殊な IP アドレスINADDR_BROADCASTと目的のポート番号を使用して構築する必要があります。 または、パラメーターが指定されている 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 が無効です。

  • WSAENETRESET 接続が設定されると SO_KEEPALIVE タイムアウトしました。

  • WSAENOPROTOOPT このオプションは不明またはサポートされていません。 特に、 SO_BROADCASTSOCK_STREAMのソケットではサポートされていませんが、一方 SO_DONTLINGERSO_KEEPALIVESO_LINGERSO_OOBINLINESOCK_DGRAMソケットではサポートされていません。

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

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

解説

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

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

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

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

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

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

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

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

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

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

Barke Software Distribution (BSD) オプションはサポートされていません SetSockOpt

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

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

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

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 クラス