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」を参照してください。
継承階層
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 ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEFAULT
lpSockAddrLen
引数が小さすぎます (構造体のSOCKADDR
サイズより小さい)。WSAEINPROGRESS
ブロックしている Windows ソケット呼び出しが進行中です。WSAEINVAL
Listen
は受け入れる前に呼び出されませんでした。WSAEMFILE
キューは受け入れるエントリ時に空であり、使用可能な記述子はありません。WSAENOBUFS
使用できるバッファー領域はありません。WSAENOTSOCK
記述子はソケットではありません。WSAEOPNOTSUPP
参照されるソケットは、接続指向サービスをサポートする型ではありません。WSAEWOULDBLOCK
ソケットは非ブロッキングとしてマークされ、受け入れられる接続はありません。
解説
このルーチンは、保留中の接続のキュー内の最初の接続を抽出し、このソケットと同じプロパティを持つ新しいソケットを作成し、それに rConnectedSocket
接続します。 キューに保留中の接続がない場合は、0 を返しGetLastError
、Accept
エラーを返します。 受け入れられたソケット (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_REUSEADDR
SetSockOpt
参照してください。WSAEFAULT
nSockAddrLen
引数が小さすぎます (構造体の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_LINGER
と SO_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
オブジェクトがアタッチされていないCAsyncSocket
hSocket
場合。
解説
ハンドルが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_SOCKET
IPPROTO_TCP
.
戻り値
関数が成功した場合は 0 以外。それ以外の場合は 0 で、特定のエラー コードは呼び出 GetLastError
すことによって取得できます。 オプションが設定 SetSockOpt
されなかった場合は、オプション GetSockOpt
の既定値を返します。 このメンバー関数には、次のエラーが適用されます。
WSANOTINITIALISED
この API を使用する前に、成功AfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEFAULT
引数がlpOptionLen
無効です。WSAEINPROGRESS
Windows ソケットのブロック操作が進行中です。WSAENOPROTOOPT
このオプションは不明またはサポートされていません。 特に、SO_BROADCAST
型SOCK_STREAM
のソケットではサポートされていません。一方SO_ACCEPTCONN
、,SO_DONTLINGER
,SO_KEEPALIVE
,SO_LINGER
は、SO_OOBINLINE
型SOCK_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 ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEINVAL
lCommand
が有効なコマンドではないかlpArgument
、または 、または指定されたソケットの型にコマンドが適用されない場合に使用できるパラメーターlCommand
ではありません。WSAEINPROGRESS
Windows ソケットのブロック操作が進行中です。WSAENOTSOCK
記述子はソケットではありません。
解説
このルーチンは、任意の状態の任意のソケットで使用できます。 プロトコルと通信サブシステムに関係なく、ソケットに関連付けられている操作パラメーターを取得または取得するために使用されます。 次のコマンドがサポートされています。
FIONBIO
ソケットで非ブロッキング モードを有効または無効にします。 このパラメーターはlpArgument
、DWORD
非ブロッキング モードを有効にする場合は 0 以外、無効にする場合は 0 を指します。 ソケットに対して発行されている場合AsyncSelect
、ソケットをブロッキング モードに戻すために使用IOCtl
しようとすると失敗WSAEINVAL
します。 ソケットをブロッキング モードに戻してエラーをWSAEINVAL
回避するには、最初に 0 のパラメーターを指定して呼び出し、次に呼び出IOCtl
AsyncSelect
lEvent
して無効にするAsyncSelect
必要があります。FIONREAD
このソケットからの 1 回Receive
の呼び出しで読み取ることができる最大バイト数を決定します。 パラメーターはlpArgument
、結果をDWORD
格納する位置IOCtl
を指します。 このソケットが型SOCK_STREAM
の場合、FIONREAD
1 つのReceive
ソケットで読み取ることができるデータの合計量を返します。これは通常、ソケットでキューに格納されているデータの総量と同じです。 このソケットが型SOCK_DGRAM
の場合は、FIONREAD
ソケットでキューに入った最初のデータグラムのサイズを返します。SIOCATMARK
すべての帯域外データが読み取られたかどうかを判断します。 これは、帯域外データ (SO_OOBINLINE
) のインライン受信用に構成されている型SOCK_STREAM
のソケットにのみ適用されます。 帯域外データが読み取りを待機していない場合、操作は 0 以外の値を返します。 それ以外の場合は 0 が返され、次Receive
ReceiveFrom
に実行されるか、ソケットで実行されると、"マーク" の前にあるデータの一部または全部が取得されます。アプリケーションでは、操作をSIOCATMARK
使用してデータが再メインかどうかを判断する必要があります。 "緊急" (帯域外) データの前に通常のデータがある場合は、順番に受信されます。 (同じ呼び出しでReceive
ReceiveFrom
帯域外データと通常のデータを混在させたりしない場合があることに注意してください)。パラメーターはlpArgument
、結果をDWORD
格納する位置IOCtl
を指します。
この関数は、バークレイソケットで使用されるサブセット 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
宛先アドレスが必要です。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
記述子はソケットではありません。WSAEOPNOTSUPP
MSG_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
記述子はソケットではありません。WSAEOPNOTSUPP
MSG_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
記述子はソケットではありません。WSAEOPNOTSUPP
MSG_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
記述子はソケットではありません。WSAEOPNOTSUPP
MSG_OOB
が指定されましたが、ソケットが型SOCK_STREAM
ではありません。WSAESHUTDOWN
ソケットがシャットダウンされました。1 または 2 に設定して呼び出された後ShutDown
、ソケットでnHow
呼びSend
出すことはできません。WSAEWOULDBLOCK
ソケットは非ブロッキングとしてマークされ、要求された操作はブロックされます。WSAEMSGSIZE
ソケットは型SOCK_DGRAM
であり、データグラムは Windows ソケットの実装でサポートされている最大値を超えています。WSAEINVAL
ソケットがバインドされていませんBind
。WSAECONNABORTED
タイムアウトまたはその他の障害により、仮想回線が中止されました。WSAECONNRESET
リモート側で仮想回線がリセットされました。
解説
Send
は、接続されたストリームまたはデータグラム ソケットに送信データを書き込むのに使用されます。 データグラム ソケットの場合は、基になるサブネットの最大 IP パケット サイズを超えないように注意する必要があります。これは、返される構造体のWSADATA
要素によってiMaxUdpDg
AfxSocketInit
与えられます。 データが長すぎて基になるプロトコルをアトミックに通過できない場合、エラー 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 ソケットのブロック操作が進行中です。WSAEFAULT
lpBuf
パラメーターlpSockAddr
がユーザー アドレス空間の一部ではないかlpSockAddr
、引数が小さすぎます (構造体のSOCKADDR
サイズより小さい)。WSAEINVAL
ホスト名が無効です。WSAENETRESET
Windows ソケットの実装によって接続が削除されたため、接続をリセットする必要があります。WSAENOBUFS
Windows ソケットの実装は、バッファーのデッドロックを報告します。WSAENOTCONN
ソケットが接続されていません (SOCK_STREAM
のみ)。WSAENOTSOCK
記述子はソケットではありません。WSAEOPNOTSUPP
MSG_OOB
が指定されましたが、ソケットが型SOCK_STREAM
ではありません。WSAESHUTDOWN
ソケットがシャットダウンされました。1 または 2 に設定して呼び出された後ShutDown
、ソケットでnHow
呼びSendTo
出すことはできません。WSAEWOULDBLOCK
ソケットは非ブロッキングとしてマークされ、要求された操作はブロックされます。WSAEMSGSIZE
ソケットは型SOCK_DGRAM
であり、データグラムは Windows ソケットの実装でサポートされている最大値を超えています。WSAECONNABORTED
タイムアウトまたはその他の障害により、仮想回線が中止されました。WSAECONNRESET
リモート側で仮想回線がリセットされました。WSAEADDRNOTAVAIL
指定されたアドレスは、ローカル コンピューターから使用できません。WSAEAFNOSUPPORT
指定されたファミリ内のアドレスは、このソケットでは使用できません。WSAEDESTADDRREQ
宛先アドレスが必要です。WSAENETUNREACH
現時点では、このホストからネットワークにアクセスできません。
解説
SendTo
は、データグラムまたはストリーム ソケットで使用され、ソケットに送信データを書き込むのに使用されます。 データグラム ソケットの場合は、基になるサブネットの最大 IP パケット サイズを超えないように注意する必要があります。これは、入力された構造体のWSADATA
要素によってiMaxUdpDg
AfxSocketInit
指定されます。 データが長すぎて基になるプロトコルをアトミックに通過できない場合は、エラー WSAEMSGSIZE が返され、データは送信されません。
a の正常な完了 SendTo
は、データが正常に配信されたことを示すものではありません。
SendTo
は、パラメーターによってSOCK_DGRAM
lpSockAddr
識別される特定のソケットにデータグラムを送信するためにソケットでのみ使用されます。
ブロードキャストを (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 ソケットのブロック操作が進行中です。WSAEFAULT
lpBuf
パラメーターlpSockAddr
がユーザー アドレス空間の一部ではないかlpSockAddr
、引数が小さすぎます (構造体のSOCKADDR
サイズより小さい)。WSAEINVAL
ホスト名が無効です。WSAENETRESET
Windows ソケットの実装によって接続が削除されたため、接続をリセットする必要があります。WSAENOBUFS
Windows ソケットの実装は、バッファーのデッドロックを報告します。WSAENOTCONN
ソケットが接続されていません (SOCK_STREAM
のみ)。WSAENOTSOCK
記述子はソケットではありません。WSAEOPNOTSUPP
MSG_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
要素によってiMaxUdpDg
AfxSocketInit
指定されます。 データが長すぎて基になるプロトコルをアトミックに通過できない場合は、エラー WSAEMSGSIZE
が返され、データは送信されません。
a の正常な完了 SendToEx
は、データが正常に配信されたことを示すものではありません。
SendToEx
は、パラメーターによってSOCK_DGRAM
lpSockAddr
識別される特定のソケットにデータグラムを送信するためにソケットでのみ使用されます。
ブロードキャストを (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_SOCKET
IPPROTO_TCP
.
戻り値
関数が成功した場合は 0 以外。それ以外の場合は 0 で、特定のエラー コードは呼び出 GetLastError
すことによって取得できます。 このメンバー関数には、次のエラーが適用されます。
WSANOTINITIALISED
この API を使用する前に、成功AfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEFAULT
lpOptionValue
がプロセス・アドレス・スペースの有効な部分にありません。WSAEINPROGRESS
Windows ソケットのブロック操作が進行中です。WSAEINVAL
nLevel
が無効であるか、または情報lpOptionValue
が無効です。WSAENETRESET
接続が設定されるとSO_KEEPALIVE
タイムアウトしました。WSAENOPROTOOPT
このオプションは不明またはサポートされていません。 特に、SO_BROADCAST
型SOCK_STREAM
のソケットではサポートされていませんが、一方SO_DONTLINGER
、SO_KEEPALIVE
、SO_LINGER
型SO_OOBINLINE
のSOCK_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_NODELAY
。 TCP_NODELAY
は、レベル IPPROTO_TCP
を使用する唯一のサポートされているソケット オプションです。他のすべてのオプションはレベル SOL_SOCKET
を使用します。
Windows ソケットの一部の実装では、オプションがアプリケーションによって設定されている場合、 SO_DEBUG
出力デバッグ情報が提供されます。
次のオプションがサポートされています SetSockOpt
。 型は、アドレス指定されたデータの型を lpOptionValue
識別します。
値 | Type | 説明 |
---|---|---|
SO_BROADCAST |
BOOL |
ソケットでのブロードキャスト メッセージの送信を許可します。 |
SO_DEBUG |
BOOL |
デバッグ情報を記録します。 |
SO_DONTLINGER |
BOOL |
送信されていないデータの送信を待機することをブロック Close しないでください。 このオプションの設定は、0 に設定した場合 SO_LINGER と l_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 ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEINVAL
nHow
が無効です。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
できます。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示