CAsyncSocket
クラス
Windows ソケット (ネットワーク通信のエンドポイント) を表します。
構文
class CAsyncSocket : public CObject
メンバー
パブリック コンストラクター
名前 | 説明 |
---|---|
CAsyncSocket::CAsyncSocket |
CAsyncSocket オブジェクトを構築します。 |
パブリック メソッド
名前 | 説明 |
---|---|
CAsyncSocket::Accept |
ソケット上の接続を受け入れます。 |
CAsyncSocket::AsyncSelect |
ソケットのイベント通知を要求します。 |
CAsyncSocket::Attach |
ソケット ハンドルを CAsyncSocket オブジェクトにアタッチします。 |
CAsyncSocket::Bind |
ローカル アドレスをソケットに関連付けます。 |
CAsyncSocket::Close |
ソケットを閉じます。 |
CAsyncSocket::Connect |
ピア ソケットへの接続を確立します。 |
CAsyncSocket::Create |
ソケットを作成します。 |
CAsyncSocket::CreateEx |
詳細オプションを使用してソケットを作成します。 |
CAsyncSocket::Detach |
CAsyncSocket オブジェクトからソケット ハンドルをデタッチします。 |
CAsyncSocket::FromHandle |
ソケット ハンドルを指定して、 CAsyncSocket オブジェクトへのポインターを返します。 |
CAsyncSocket::GetLastError |
失敗した最後の操作のエラー状態を取得します。 |
CAsyncSocket::GetPeerName |
ソケットが接続されているピア ソケットのアドレスを取得します。 |
CAsyncSocket::GetPeerNameEx |
ソケットが接続されているピア ソケットのアドレスを取得します (IPv6 アドレスを処理します)。 |
CAsyncSocket::GetSockName |
ソケットのローカル名を取得します。 |
CAsyncSocket::GetSockNameEx |
ソケットのローカル名を取得します (IPv6 アドレスを処理します)。 |
CAsyncSocket::GetSockOpt |
ソケット オプションを取得します。 |
CAsyncSocket::IOCtl |
ソケットのモードを制御します。 |
CAsyncSocket::Listen |
受信接続要求をリッスンするソケットを確立します。 |
CAsyncSocket::Receive |
ソケットからデータを受信します。 |
CAsyncSocket::ReceiveFrom |
データグラムを受信し、ソース アドレスを格納します。 |
CAsyncSocket::ReceiveFromEx |
データグラムを受信し、ソース アドレスを格納します (IPv6 アドレスを処理します)。 |
CAsyncSocket::Send |
接続されたソケットにデータを送信します。 |
CAsyncSocket::SendTo |
特定の宛先にデータを送信します。 |
CAsyncSocket::SendToEx |
特定の宛先にデータを送信します (IPv6 アドレスを処理します)。 |
CAsyncSocket::SetSockOpt |
ソケット オプションを設定します。 |
CAsyncSocket::ShutDown |
ソケットの Send 呼び出しまたは Receive 呼び出しを無効にします。 |
CASyncSocket::Socket |
ソケット ハンドルを割り当てます。 |
保護メソッド
名前 | 説明 |
---|---|
CAsyncSocket::OnAccept |
Accept を呼び出すことによって保留中の接続要求を受け入れることができることをリッスン ソケットに通知します。 |
CAsyncSocket::OnClose |
ソケットに接続されているソケットが閉じられたことをソケットに通知します。 |
CAsyncSocket::OnConnect |
接続試行が正常に完了したかエラーが発生したかに関係なく、接続ソケットに通知します。 |
CAsyncSocket::OnOutOfBandData |
ソケットで読み取る帯域外データがあることを受信ソケットに通知します。通常は緊急メッセージです。 |
CAsyncSocket::OnReceive |
Receive を呼び出して取得するデータがあることをリッスン ソケットに通知します。 |
CAsyncSocket::OnSend |
Send を呼び出してデータを送信できることをソケットに通知します。 |
パブリック演算子
名前 | 説明 |
---|---|
CAsyncSocket::operator = | 新しい値を CAsyncSocket オブジェクトに代入します。 |
CAsyncSocket::operator SOCKET | この演算子を使用して、CAsyncSocket オブジェクトのSOCKET ハンドルを取得します。 |
パブリック データ メンバー
名前 | 説明 |
---|---|
CAsyncSocket::m_hSocket |
このCAsyncSocket オブジェクトにアタッチされているSOCKET ハンドルを示します。 |
解説
クラス CAsyncSocket
は Windows ソケット関数 API をカプセル化し、MFC と組み合わせて Windows ソケットを使用するプログラマ向けのオブジェクト指向の抽象化を提供します。
このクラスは、ネットワーク通信を理解するという前提に基づいています。 Unicode 文字列とマルチバイト文字セット (MBCS) 文字列の間のブロック、バイト順の違い、および変換を処理する必要があります。 これらの問題を管理するより便利なインターフェイスが必要な場合は、クラスの CSocket
を参照してください。
CAsyncSocket
オブジェクトを使用するには、そのコンストラクターを呼び出し、Create
関数を呼び出して、受け入れられたソケットを除き、基になるソケット ハンドル (型SOCKET
) を作成します。 サーバー ソケットの場合は Listen
メンバー関数を呼び出し、クライアント ソケットの場合は Connect
メンバー関数を呼び出します。 サーバー ソケットは、接続要求の受信時に Accept
関数を呼び出す必要があります。 残りの CAsyncSocket
関数を使用して、ソケット間の通信を実行します。 完了したら、ヒープ上に作成された CAsyncSocket
オブジェクトを破棄します。デストラクターは自動的に Close
関数を呼び出します。 SOCKET
データ型については、「Windows ソケット: 背景」の記事で説明。
Note
静的にリンクされた MFC アプリケーションのセカンダリ スレッドで MFC ソケットを使用する場合は、ソケットを使用してソケット ライブラリを初期化する各スレッドで AfxSocketInit
を呼び出す必要があります。 既定では、 AfxSocketInit
はプライマリ スレッドでのみ呼び出されます。
詳細については、「 Windows Sockets: Using Class CAsyncSocket
and related articles.」および「 Windows Sockets 2 APIを参照してください。
継承階層
CAsyncSocket
要件
ヘッダー: afxsock.h
CAsyncSocket::Accept
ソケット上の接続を受け入れるには、このメンバー関数を呼び出します。
virtual BOOL Accept(
CAsyncSocket& rConnectedSocket,
SOCKADDR* lpSockAddr = NULL,
int* lpSockAddrLen = NULL);
パラメーター
rConnectedSocket
接続に使用できる新しいソケットを識別する参照。
lpSockAddr
接続ソケットのアドレスを受け取る SOCKADDR
構造体へのポインター (ネットワークで知られている)。 lpSockAddr
引数の正確な形式は、ソケットの作成時に確立されたアドレス ファミリによって決まります。 lpSockAddr
やlpSockAddrLen
がNULL
と等しい場合、受け入れられたソケットのリモート アドレスに関する情報は返されません。
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
に接続します。 キューに保留中の接続がない場合、 Accept
は 0 を返し、 GetLastError
はエラーを返します。 受け入れられたソケット (rConnectedSocket
) を使用して、より多くの接続を受け入れることはできません。 元のソケットは開いたままでリッスンしています。
引数 lpSockAddr
は、通信層に知られているように、接続ソケットのアドレスで入力される結果パラメーターです。 Accept
は、 SOCK_STREAM
などの接続ベースのソケット型で使用されます。
CAsyncSocket::AsyncSelect
ソケットのイベント通知を要求するには、このメンバー関数を呼び出します。
BOOL AsyncSelect(long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
パラメーター
lEvent
アプリケーションが関心を持つネットワーク イベントの組み合わせを指定するビットマスク。
FD_READ
読み取り準備の通知を受け取りたい。FD_WRITE
データを読み取ることができるときに通知を受け取りたい。FD_OOB
帯域外データの到着通知を受け取りたい。FD_ACCEPT
受信接続の通知を受信する。FD_CONNECT
接続結果の通知を受け取りたい。FD_CLOSE
ピアによってソケットが閉じられたときに通知を受け取りたい。
戻り値
関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastError
を呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。
WSANOTINITIALISED
この API を使用する前に、正常なAfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEINVAL
指定されたパラメーターのいずれかが無効であることを示します。WSAEINPROGRESS
Windows ソケットのブロック操作が進行中です。
解説
この関数は、ソケットに対して呼び出される MFC コールバック通知関数を指定するために使用されます。 AsyncSelect
は、このソケットを非ブロッキング モードに自動的に設定します。 詳細については、「 Windows ソケット: ソケット通知」を参照してください。
CAsyncSocket::Attach
このメンバー関数を呼び出して、CAsyncSocket
オブジェクトにhSocket
ハンドルをアタッチします。
BOOL Attach(
SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
パラメーター
hSocket
ソケットへのハンドルを格納します。
lEvent
アプリケーションが関心を持つネットワーク イベントの組み合わせを指定するビットマスク。
FD_READ
読み取り準備の通知を受け取りたい。FD_WRITE
データを読み取ることができるときに通知を受け取りたい。FD_OOB
帯域外データの到着通知を受け取りたい。FD_ACCEPT
受信接続の通知を受信する。FD_CONNECT
接続結果の通知を受け取りたい。FD_CLOSE
ピアによってソケットが閉じられたときに通知を受け取りたい。
戻り値
正常終了した場合は 0 以外を返します。
解説
SOCKET
ハンドルは、オブジェクトのm_hSocket
データ メンバーに格納されます。
CAsyncSocket::Bind
このメンバー関数を呼び出して、ローカル アドレスをソケットに関連付けます。
BOOL Bind(
UINT nSocketPort,
LPCTSTR lpszSocketAddress = NULL);
BOOL Bind (
const SOCKADDR* lpSockAddr,
int nSockAddrLen);
パラメーター
nSocketPort
ソケット アプリケーションを識別するポート。
lpszSocketAddress
ネットワーク アドレス。"128.56.22.8" などの点線の番号。 このパラメーターに NULL
文字列を渡すと、 CAsyncSocket
インスタンスはすべてのネットワーク インターフェイスでクライアント アクティビティをリッスンする必要があることを示します。
lpSockAddr
このソケットに割り当てるアドレスを含む SOCKADDR
構造体へのポインター。
nSockAddrLen
アドレスの長さ (バイト単位) lpSockAddr
。
戻り値
関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastError
を呼び出すことによって特定のエラー コードを取得できます。 次の一覧では、返される可能性があるエラーの一部について説明します。 完全な一覧については、「 Windows ソケットのエラー コードを参照してください。
WSANOTINITIALISED
この API を使用する前に、正常なAfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEADDRINUSE
指定したアドレスは既に使用されています。 (SetSockOpt
のSO_REUSEADDR
ソケット オプションを参照してください)。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
ソケットは非ブロッキングとしてマークされ、接続をすぐに完了することはできません。
解説
ソケットがバインドされていない場合、システムによって一意の値がローカル関連付けに割り当てられ、ソケットはバインド済みとしてマークされます。 名前構造のアドレス フィールドがすべてゼロの場合、 Connect
は 0 を返します。 拡張エラー情報を取得するには、 GetLastError
メンバー関数を呼び出します。
ストリーム ソケット (種類 SOCK_STREAM
) の場合、外部ホストへのアクティブな接続が開始されます。 ソケット呼び出しが正常に完了すると、ソケットはデータを送受信する準備が整います。
データグラム ソケット (型 SOCK_DGRAM
) の場合、既定の宛先が設定され、後続の Send
および Receive
呼び出しで使用されます。
CAsyncSocket::Create
ソケット オブジェクトを作成して Windows ソケットを作成してアタッチした後、 Create
メンバー関数を呼び出します。
BOOL Create(
UINT nSocketPort = 0,
int nSocketType = SOCK_STREAM,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
LPCTSTR lpszSocketAddress = NULL);
パラメーター
nSocketPort
ソケットで使用される既知のポート。Windows ソケットでポートを選択する場合は 0。
nSocketType
SOCK_STREAM
または SOCK_DGRAM
。
lEvent
アプリケーションが関心を持つネットワーク イベントの組み合わせを指定するビットマスク。
FD_READ
読み取り準備の通知を受け取りたい。FD_WRITE
書き込み準備の通知を受け取りたい。FD_OOB
帯域外データの到着通知を受け取りたい。FD_ACCEPT
受信接続の通知を受信する。FD_CONNECT
完了した接続の通知を受け取りたい。FD_CLOSE
ソケットクロージャの通知を受け取りたい。
lpszSockAddress
接続されているソケットのネットワーク アドレスを含む文字列へのポインター。"128.56.22.8" などのドット番号。 このパラメーターに NULL
文字列を渡すと、 CAsyncSocket
インスタンスはすべてのネットワーク インターフェイスでクライアント アクティビティをリッスンする必要があることを示します。
戻り値
関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastError
を呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。
WSANOTINITIALISED
この API を使用する前に、正常なAfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEAFNOSUPPORT
指定されたアドレス ファミリはサポートされていません。WSAEINPROGRESS
Windows ソケットのブロック操作が進行中です。WSAEMFILE
これ以上ファイル記述子を使用できません。WSAENOBUFS
使用できるバッファー領域はありません。 ソケットを作成できません。WSAEPROTONOSUPPORT
指定されたポートはサポートされていません。WSAEPROTOTYPE
指定されたポートがこのソケットに対して正しくない型です。WSAESOCKTNOSUPPORT
指定されたソケットの種類は、このアドレス ファミリではサポートされていません。
解説
Create
は Socket
を呼び出し、成功した場合は Bind
を呼び出して、指定したアドレスにソケットをバインドします。 次のソケットの種類がサポートされています。
SOCK_STREAM
シーケンス化された信頼性の高い全二重接続ベースのバイト ストリームを提供します。 インターネット アドレス ファミリに伝送制御プロトコル (TCP) を使用します。SOCK_DGRAM
固定 (通常は小さい) 最大長のコネクションレスで信頼性の低いパケットであるデータグラムをサポートします。 インターネット アドレス ファミリにユーザー データグラム プロトコル (UDP) を使用します。Note
Accept
メンバー関数は、新しい空のCSocket
オブジェクトへの参照をパラメーターとして受け取ります。Accept
を呼び出す前に、このオブジェクトを構築する必要があります。 このソケット オブジェクトがスコープ外になると、接続が閉じられることに注意してください。 この新しいソケット オブジェクトに対してCreate
を呼び出さないでください。
重要
Create
はスレッド セーフではありません。 異なるスレッドによって同時に呼び出すことができるマルチスレッド環境で呼び出す場合は、ミューテックスまたはその他の同期ロックを使用して各呼び出しを保護してください。
ストリーム ソケットとデータグラム ソケットの詳細については、「Windows ソケット: バックグラウンドおよびWindows ソケット: ポートとソケット アドレスおよび Windows Sockets 2 API 」を参照してください。
CAsyncSocket::CreateEx
ソケット オブジェクトを作成して Windows ソケットを作成してアタッチした後、 CreateEx
メンバー関数を呼び出します。
ソケットの種類などの高度なオプションを指定する必要がある場合は、この関数を使用します。
BOOL CreateEx(
ADDRINFOT* pAI,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
パラメーター
pAI
ファミリやソケットの種類などのソケット情報を保持する ADDRINFOT
へのポインター。
lEvent
アプリケーションが関心を持つネットワーク イベントの組み合わせを指定するビットマスク。
FD_READ
読み取り準備の通知を受け取りたい。FD_WRITE
書き込み準備の通知を受け取りたい。FD_OOB
帯域外データの到着通知を受け取りたい。FD_ACCEPT
受信接続の通知を受信する。FD_CONNECT
完了した接続の通知を受け取りたい。FD_CLOSE
ソケットクロージャの通知を受け取りたい。
戻り値
Create()
の戻り値を参照してください。
解説
Create()
の解説を参照してください。
CAsyncSocket::Detach
このメンバー関数を呼び出して、m_hSocket
データ メンバー内のSOCKET
ハンドルをCAsyncSocket
オブジェクトからデタッチし、m_hSocket
を NULL
に設定します。
SOCKET Detach();
CAsyncSocket::FromHandle
CAsyncSocket
オブジェクトへのポインターを返します。
static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);
パラメーター
hSocket
ソケットへのハンドルを格納します。
戻り値
CAsyncSocket
オブジェクトへのポインター。または、hSocket
にアタッチされているCAsyncSocket
オブジェクトがない場合にNULL
。
解説
SOCKET
ハンドルが指定されると、CAsyncSocket
オブジェクトがハンドルにアタッチされていない場合、メンバー関数はNULL
を返します。
CAsyncSocket::GetLastError
このメンバー関数を呼び出して、失敗した最後の操作のエラー状態を取得します。
static int PASCAL GetLastError();
戻り値
戻り値は、このスレッドによって実行された最後の Windows ソケット API ルーチンのエラー コードを示します。
解説
特定のメンバー関数がエラーが発生したことを示す場合は、 GetLastError
を呼び出して適切なエラー コードを取得する必要があります。 該当するエラー コードの一覧については、個々のメンバー関数の説明を参照してください。
エラー コードの詳細については、「 Windows Sockets 2 APIを参照してください。
CAsyncSocket::GetPeerName
このメンバー関数を呼び出して、このソケットが接続されているピア ソケットのアドレスを取得します。
BOOL GetPeerName(
CString& rPeerAddress,
UINT& rPeerPort);
BOOL GetPeerName(
SOCKADDR* lpSockAddr,
int* lpSockAddrLen);
パラメーター
rPeerAddress
ドット番号の IP アドレスを受け取る CString
オブジェクトへの参照。
rPeerPort
ポートを格納する UINT
への参照。
lpSockAddr
ピア ソケットの名前を受け取る SOCKADDR
構造体へのポインター。
lpSockAddrLen
アドレスの長さをバイト単位で lpSockAddr
ポインター。 戻り値の場合、 lpSockAddrLen
引数には、返される lpSockAddr
の実際のサイズがバイト単位で格納されます。
戻り値
関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastError
を呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。
WSANOTINITIALISED
この API を使用する前に、正常なAfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEFAULT
lpSockAddrLen
引数の大きさが不十分です。WSAEINPROGRESS
ブロックしている Windows ソケット呼び出しが進行中です。WSAENOTCONN
ソケットが接続されていません。WSAENOTSOCK
記述子はソケットではありません。
解説
IPv6 アドレスを処理するには、 CAsyncSocket::GetPeerNameEx
を使用します。
CAsyncSocket::GetPeerNameEx
このメンバー関数を呼び出して、このソケットが接続されているピア ソケットのアドレスを取得します (IPv6 アドレスを処理します)。
BOOL GetPeerNameEx(
CString& rPeerAddress,
UINT& rPeerPort);
パラメーター
rPeerAddress
ドット番号の IP アドレスを受け取る CString
オブジェクトへの参照。
rPeerPort
ポートを格納する UINT
への参照。
戻り値
関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastError
を呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。
WSANOTINITIALISED
この API を使用する前に、正常なAfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEFAULT
lpSockAddrLen
引数の大きさが不十分です。WSAEINPROGRESS
ブロックしている Windows ソケット呼び出しが進行中です。WSAENOTCONN
ソケットが接続されていません。WSAENOTSOCK
記述子はソケットではありません。
解説
この関数は、IPv6 アドレスと古いプロトコルを処理する点を除き、 CAsyncSocket::GetPeerName
と同じです。
CAsyncSocket::GetSockName
ソケットのローカル名を取得するには、このメンバー関数を呼び出します。
BOOL GetSockName(
CString& rSocketAddress,
UINT& rSocketPort);
BOOL GetSockName(
SOCKADDR* lpSockAddr,
int* lpSockAddrLen);
パラメーター
rSocketAddress
ドット番号の IP アドレスを受け取る CString
オブジェクトへの参照。
rSocketPort
ポートを格納する UINT
への参照。
lpSockAddr
ソケットのアドレスを受け取る SOCKADDR
構造体へのポインター。
lpSockAddrLen
アドレスの長さをバイト単位で lpSockAddr
ポインター。
戻り値
関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastError
を呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。
WSANOTINITIALISED
この API を使用する前に、正常なAfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEFAULT
lpSockAddrLen
引数の大きさが不十分です。WSAEINPROGRESS
Windows ソケットのブロック操作が進行中です。WSAENOTSOCK
記述子はソケットではありません。WSAEINVAL
ソケットは、Bind
を持つアドレスにバインドされていません。
解説
この呼び出しは、最初にBind
を行わずにConnect
呼び出しが行われた場合に特に便利です。この呼び出しは、システムによって設定されたローカルアソシエーションを決定するための唯一の手段を提供します。
IPv6 アドレスを処理するには、 CAsyncSocket::GetSockNameEx
CAsyncSocket::GetSockNameEx
ソケットのローカル名を取得するには、このメンバー関数を呼び出します (IPv6 アドレスを処理します)。
BOOL GetSockNameEx(
CString& rSocketAddress,
UINT& rSocketPort);
パラメーター
rSocketAddress
ドット番号の IP アドレスを受け取る CString
オブジェクトへの参照。
rSocketPort
ポートを格納する UINT
への参照。
戻り値
関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastError
を呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。
WSANOTINITIALISED
この API を使用する前に、正常なAfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。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 または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
では、次のオプションがサポートされています。 Type は、 lpOptionValue
によってアドレス指定されたデータの型を識別します。 TCP_NODELAY
オプションではレベル IPPROTO_TCP
が使用され、他のすべてのオプションではレベル SOL_SOCKET
が使用されます。
値 | Type | 説明 |
---|---|---|
SO_ACCEPTCONN |
BOOL |
ソケットがリスニングしています。 |
SO_BROADCAST |
BOOL |
ソケットは、ブロードキャスト メッセージの送信用に構成されます。 |
SO_DEBUG |
BOOL |
デバッグが有効です。 |
SO_DONTLINGER |
BOOL |
true の場合、 SO_LINGER オプションは無効になります。 |
SO_DONTROUTE |
BOOL |
ルーティングが無効です |
SO_ERROR |
int |
エラーの状態を取得し、クリアします。 |
SO_KEEPALIVE |
BOOL |
キープアライブが送信されています。 |
SO_LINGER |
struct LINGER |
現在の残存オプションを返します。 |
SO_OOBINLINE |
BOOL |
帯域外データは、通常のデータ ストリームで受信されています。 |
SO_RCVBUF |
int |
受信のバッファー サイズ。 |
SO_REUSEADDR |
BOOL |
ソケットは、既に使用されているアドレスにバインドできます。 |
SO_SNDBUF |
int |
送信のバッファー サイズ。 |
SO_TYPE |
int |
ソケットの型 (たとえば、 SOCK_STREAM )。 |
TCP_NODELAY |
BOOL |
送信結合用の Nagle アルゴリズムを無効にします。 |
GetSockOpt
でサポートされていないバークレイ ソフトウェアディストリビューション (BSD) オプションは次のとおりです。
値 | Type | 説明 |
---|---|---|
SO_RCVLOWAT |
int |
低いウォーターマークを受け取ります。 |
SO_RCVTIMEO |
int |
受信タイムアウト。 |
SO_SNDLOWAT |
int |
低いウォーター マークを送信します。 |
SO_SNDTIMEO |
int |
送信タイムアウト。 |
IP_OPTIONS |
IP ヘッダーのオプションを取得します。 | |
TCP_MAXSEG |
int |
TCP の最大セグメント サイズを取得します。 |
サポートされていないオプションでGetSockOpt
を呼び出すと、GetLastError
からWSAENOPROTOOPT
のエラー コードが返されます。
CAsyncSocket::IOCtl
ソケットのモードを制御するには、このメンバー関数を呼び出します。
BOOL IOCtl(
long lCommand,
DWORD* lpArgument);
パラメーター
lCommand
ソケットで実行するコマンド。
lpArgument
lCommand
のパラメーターへのポインター。
戻り値
関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastError
を呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。
WSANOTINITIALISED
この API を使用する前に、正常なAfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEINVAL
lCommand
が有効なコマンドではないか、lpArgument
がlCommand
に許容できるパラメーターではないか、コマンドが指定されたソケットの種類に適用できません。WSAEINPROGRESS
Windows ソケットのブロック操作が進行中です。WSAENOTSOCK
記述子はソケットではありません。
解説
このルーチンは、任意の状態の任意のソケットで使用できます。 プロトコルと通信サブシステムに関係なく、ソケットに関連付けられている操作パラメーターを取得または取得するために使用されます。 次のコマンドがサポートされています。
FIONBIO
ソケットで非ブロッキング モードを有効または無効にします。lpArgument
パラメーターはDWORD
を指します。非ブロッキング モードを有効にする場合は 0 以外、無効にする場合は 0 です。 ソケットでAsyncSelect
が発行されている場合、IOCtl
を使用してソケットをブロッキング モードに戻そうとすると、WSAEINVAL
で失敗します。 ソケットをブロッキング モードに戻し、WSAEINVAL
エラーを防ぐには、アプリケーションはまず、lEvent
パラメーターが 0 のAsyncSelect
を呼び出してAsyncSelect
を無効にしてから、IOCtl
を呼び出す必要があります。FIONREAD
このソケットからの 1 つのReceive
呼び出しで読み取ることができる最大バイト数を決定します。lpArgument
パラメーターは、IOCtl
が結果を格納するDWORD
を指します。 このソケットの型がSOCK_STREAM
の場合、FIONREAD
は単一のReceive
で読み取ることができるデータの総量を返します。これは通常、ソケットでキューに登録されたデータの総量と同じです。 このソケットがSOCK_DGRAM
型の場合、FIONREAD
はソケットでキューに入った最初のデータグラムのサイズを返します。SIOCATMARK
すべての帯域外データが読み取られたかどうかを判断します。 これは、帯域外データ (SO_OOBINLINE
) のインライン受信用に構成されたSOCK_STREAM
型のソケットにのみ適用されます。 帯域外データが読み取りを待機していない場合、操作は 0 以外の値を返します。 それ以外の場合は 0 が返され、ソケットで実行される次のReceive
またはReceiveFrom
は、"マーク" の前にあるデータの一部またはすべてを取得します。アプリケーションは、SIOCATMARK
操作を使用して、データが残っているかどうかを判断する必要があります。 "緊急" (帯域外) データの前に通常のデータがある場合は、順番に受信されます。 (Receive
またはReceiveFrom
では、同じ呼び出しで帯域外データと通常のデータが混在することはありません。lpArgument
パラメーターは、IOCtl
が結果を格納するDWORD
を指します。
この関数は、バークレイソケットで使用される ioctl()
のサブセットです。 特に、 FIOASYNC
と同等のコマンドはありませんが、サポートされている唯一のソケット レベルのコマンドは SIOCATMARK
です。
CAsyncSocket::Listen
このメンバー関数を呼び出して、着信接続要求をリッスンします。
BOOL Listen(int nConnectionBacklog = 5);
パラメーター
nConnectionBacklog
保留中の接続のキューを拡張できる最大長。 有効な範囲は 1 から 5 です。
戻り値
関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastError
を呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。
WSANOTINITIALISED
この API を使用する前に、正常なAfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEADDRINUSE
使用中のアドレスをリッスンしようとしました。WSAEINPROGRESS
Windows ソケットのブロック操作が進行中です。WSAEINVAL
ソケットがBind
にバインドされていないか、既に接続されています。WSAEISCONN
ソケットは既に接続されています。WSAEMFILE
これ以上ファイル記述子を使用できません。WSAENOBUFS
使用できるバッファー領域はありません。WSAENOTSOCK
記述子はソケットではありません。WSAEOPNOTSUPP
参照されるソケットは、Listen
操作をサポートする型ではありません。
解説
接続を受け入れるために、ソケットは最初に Create
で作成され、受信接続のバックログは Listen
で指定され、その後接続は Accept
で受け入れられます。 Listen
は、接続をサポートするソケット 、つまり SOCK_STREAM
型のソケットにのみ適用されます。 このソケットは、受信接続が受信確認され、プロセスによる受け入れ待ちでキューに入れられる "パッシブ" モードになります。
この関数は通常、一度に複数の接続要求を持つ可能性があるサーバー (または接続を受け入れるアプリケーション) によって使用されます。キューがいっぱいになった接続要求が到着すると、クライアントは WSAECONNREFUSED
を示すエラーを受け取ります。
Listen
は、使用可能なポート (記述子) がない場合に、引き続き合理的な機能を試みます。 キューが空になるまで、接続を受け入れます。 ポートが使用可能になると、 Listen
または Accept
の後で呼び出すと、キューが現在または最新の "バックログ" (可能な場合) に補充され、受信接続のリッスンが再開されます。
CAsyncSocket::m_hSocket
このCAsyncSocket
オブジェクトによってカプセル化されたソケットのSOCKET
ハンドルを格納します。
SOCKET m_hSocket;
CAsyncSocket::OnAccept
Accept
メンバー関数を呼び出すことによって保留中の接続要求を受け入れることができることをリッスン ソケットに通知するために、フレームワークによって呼び出されます。
virtual void OnAccept(int nErrorCode);
パラメーター
nErrorCode
ソケットの最新のエラー。 次のエラー コードは、 OnAccept
メンバー関数に適用されます。
0 関数が正常に実行されました。
WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。
解説
詳細については、「Windows ソケット: ソケット通知」を参照してください。
CAsyncSocket::OnClose
接続されたソケットがプロセスによって閉じられていることをこのソケットに通知するために、フレームワークによって呼び出されます。
virtual void OnClose(int nErrorCode);
パラメーター
nErrorCode
ソケットの最新のエラー。 OnClose
メンバー関数には、次のエラー コードが適用されます。
0 関数が正常に実行されました。
WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAECONNRESET
リモート側で接続がリセットされました。WSAECONNABORTED
タイムアウトまたはその他のエラーが原因で接続が中止されました。
解説
詳細については、「Windows ソケット: ソケット通知」を参照してください。
CAsyncSocket::OnConnect
正常に実行されたかエラーが発生したかに関係なく、接続試行が完了したことをこの接続ソケットに通知するためにフレームワークによって呼び出されます。
virtual void OnConnect(int nErrorCode);
パラメーター
nErrorCode
ソケットの最新のエラー。 OnConnect
メンバー関数には、次のエラー コードが適用されます。
0 関数が正常に実行されました。
WSAEADDRINUSE
指定したアドレスは既に使用されています。WSAEADDRNOTAVAIL
指定されたアドレスは、ローカル コンピューターから使用できません。WSAEAFNOSUPPORT
指定されたファミリ内のアドレスは、このソケットでは使用できません。WSAECONNREFUSED
接続の試行が強制的に拒否されました。WSAEDESTADDRREQ
宛先アドレスが必要です。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
この演算子を使用して、CAsyncSocket
オブジェクトのSOCKET
ハンドルを取得します。
operator SOCKET() const;
戻り値
成功した場合は、 SOCKET
オブジェクトのハンドル。それ以外の場合は NULL
。
解説
このハンドルを使用して、Windows API を直接呼び出すことができます。
CAsyncSocket::Receive
ソケットからデータを受信するには、このメンバー関数を呼び出します。
virtual int Receive(
void* lpBuf,
int nBufLen,
int nFlags = 0);
パラメーター
lpBuf
受信データのバッファー。
nBufLen
lpBuf
の長さ (バイト単位)。
nFlags
呼び出しを行う方法を指定します。 この関数のセマンティクスは、ソケット オプションと nFlags
パラメーターによって決まります。 後者は、次のいずれかの値を C++ ビットごとの OR 演算子 (|
) と組み合わせることによって構築されます。
MSG_PEEK
受信データをピークします。 データはバッファーにコピーされますが、入力キューからは削除されません。MSG_OOB
帯域外データを処理します。
戻り値
エラーが発生しなかった場合、 Receive
は受信したバイト数を返します。 接続が閉じられている場合は、0 を返します。 それ以外の場合は、 SOCKET_ERROR
の値が返され、 GetLastError
を呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。
WSANOTINITIALISED
この API を使用する前に、正常なAfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAENOTCONN
ソケットが接続されていません。WSAEINPROGRESS
Windows ソケットのブロック操作が進行中です。WSAENOTSOCK
記述子はソケットではありません。WSAEOPNOTSUPP
MSG_OOB
が指定されましたが、ソケットがSOCK_STREAM
型ではありません。WSAESHUTDOWN
ソケットがシャットダウンされました。nHow
を 0 または 2 に設定してShutDown
が呼び出された後、ソケットでReceive
を呼び出すことはできません。WSAEWOULDBLOCK
ソケットは非ブロッキングとしてマークされ、Receive
操作はブロックされます。WSAEMSGSIZE
データグラムが大きすぎて指定されたバッファーに収まりきれず、切り捨てられました。WSAEINVAL
ソケットがBind
にバインドされていません。WSAECONNABORTED
タイムアウトまたはその他の障害により、仮想回線が中止されました。WSAECONNRESET
リモート側で仮想回線がリセットされました。
解説
この関数は、接続されたストリームまたはデータグラム ソケットに使用され、受信データの読み取りに使用されます。
SOCK_STREAM
型のソケットの場合、指定されたバッファーのサイズまで、現在使用可能な限り多くの情報が返されます。 ソケットが帯域外データ (ソケット オプション SO_OOBINLINE
) のインライン受信用に構成されており、帯域外データが未読の場合は、帯域外データのみが返されます。 アプリケーションは、 IOCtlSIOCATMARK
オプションまたは OnOutOfBandData
を使用して、帯域外データを読み取る必要があるかどうかを判断できます。
データグラム ソケットの場合、最初にエンキューされたデータグラムから、指定されたバッファーのサイズまで、データが抽出されます。 データグラムが指定されたバッファーより大きい場合、バッファーはデータグラムの最初の部分でいっぱいになり、余分なデータは失われ、Receive
はエラー コードがWSAEMSGSIZE
に設定されたSOCKET_ERROR
の値を返します。 ソケットで使用できる受信データがない場合は、エラー コードが WSAEWOULDBLOCK
に設定されたSOCKET_ERROR
の値が返されます。 OnReceive
コールバック関数を使用して、より多くのデータがいつ到着するかを判断できます。
ソケットが SOCK_STREAM
タイプで、リモート側が接続を正常にシャットダウンした場合、 Receive
はすぐに 0 バイトを受信して完了します。 接続がリセットされた場合、 Receive
はエラー WSAECONNRESET
で失敗します。
Receive
は、 CAsyncSocket::OnReceive
が呼び出されるたびに 1 回だけ呼び出す必要があります。
例
CAsyncSocket::OnReceive
の例を参照してください。
CAsyncSocket::ReceiveFrom
このメンバー関数を呼び出してデータグラムを受信し、ソース アドレスを SOCKADDR
構造体または rSocketAddress
に格納します。
int ReceiveFrom(
void* lpBuf,
int nBufLen,
CString& rSocketAddress,
UINT& rSocketPort,
int nFlags = 0);
int ReceiveFrom(
void* lpBuf,
int nBufLen,
SOCKADDR* lpSockAddr,
int* lpSockAddrLen,
int nFlags = 0);
パラメーター
lpBuf
受信データのバッファー。
nBufLen
lpBuf
の長さ (バイト単位)。
rSocketAddress
ドット番号の IP アドレスを受け取る CString
オブジェクトへの参照。
rSocketPort
ポートを格納する UINT
への参照。
lpSockAddr
戻り時にソース アドレスを保持する SOCKADDR
構造体へのポインター。
lpSockAddrLen
lpSockAddr
バイト単位のソース アドレスの長さを指すポインター。
nFlags
呼び出しを行う方法を指定します。 この関数のセマンティクスは、ソケット オプションと nFlags
パラメーターによって決まります。 後者は、次のいずれかの値を C++ ビットごとの OR 演算子 (|
) と組み合わせることによって構築されます。
MSG_PEEK
受信データをピークします。 データはバッファーにコピーされますが、入力キューからは削除されません。MSG_OOB
帯域外データを処理します。
戻り値
エラーが発生しなかった場合、 ReceiveFrom
は受信したバイト数を返します。 接続が閉じられている場合は、0 を返します。 それ以外の場合は、 SOCKET_ERROR
の値が返され、 GetLastError
を呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。
WSANOTINITIALISED
この API を使用する前に、正常なAfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEFAULT
lpSockAddrLen
引数が無効です。lpSockAddr
バッファーが小さすぎてピア アドレスに対応できませんでした。WSAEINPROGRESS
Windows ソケットのブロック操作が進行中です。WSAEINVAL
ソケットがBind
にバインドされていません。WSAENOTCONN
ソケットが接続されていません (SOCK_STREAM
のみ)。WSAENOTSOCK
記述子はソケットではありません。WSAEOPNOTSUPP
MSG_OOB
が指定されましたが、ソケットがSOCK_STREAM
型ではありません。WSAESHUTDOWN
ソケットがシャットダウンされました。nHow
を 0 または 2 に設定してShutDown
が呼び出された後、ソケットでReceiveFrom
を呼び出すことはできません。WSAEWOULDBLOCK
ソケットは非ブロッキングとしてマークされ、ReceiveFrom
操作はブロックされます。WSAEMSGSIZE
データグラムが大きすぎて指定されたバッファーに収まりきれず、切り捨てられました。WSAECONNABORTED
タイムアウトまたはその他の障害により、仮想回線が中止されました。WSAECONNRESET
リモート側で仮想回線がリセットされました。
解説
この関数は、(接続されている可能性がある) ソケット上の受信データを読み取り、データの送信元のアドレスをキャプチャするために使用されます。
IPv6 アドレスを処理するには、 CAsyncSocket::ReceiveFromEx
を使用します。
SOCK_STREAM
型のソケットの場合、指定されたバッファーのサイズまで、現在使用可能な限り多くの情報が返されます。 ソケットが帯域外データ (ソケット オプション SO_OOBINLINE
) のインライン受信用に構成されており、帯域外データが未読の場合は、帯域外データのみが返されます。 アプリケーションは、 IOCtlSIOCATMARK
オプションまたは OnOutOfBandData
を使用して、帯域外データを読み取る必要があるかどうかを判断できます。 lpSockAddr
およびlpSockAddrLen
パラメーターは、SOCK_STREAM
ソケットでは無視されます。
データグラム ソケットの場合、最初にエンキューされたデータグラムから、指定されたバッファーのサイズまで、データが抽出されます。 データグラムが指定されたバッファーより大きい場合、バッファーはメッセージの最初の部分でいっぱいになり、余分なデータは失われ、ReceiveFrom
はエラー コードがWSAEMSGSIZE
に設定されたSOCKET_ERROR
の値を返します。
lpSockAddr
が 0 以外で、ソケットが SOCK_DGRAM
型の場合、データを送信したソケットのネットワーク アドレスは、対応するSOCKADDR
構造体にコピーされます。 lpSockAddrLen
が指す値は、この構造体のサイズに初期化され、戻り時に変更され、そこに格納されているアドレスの実際のサイズを示します。 ソケットで受信データが使用できない場合、 ReceiveFrom
呼び出しは、ソケットが非ブロッキングでない限り、データの到着を待機します。 この場合、エラー コードが WSAEWOULDBLOCK
に設定されたSOCKET_ERROR
の値が返されます。 OnReceive
コールバックを使用して、より多くのデータがいつ到着するかを判断できます。
ソケットが SOCK_STREAM
タイプで、リモート側が接続を正常にシャットダウンした場合、 ReceiveFrom
はすぐに 0 バイトを受信して完了します。
CAsyncSocket::ReceiveFromEx
このメンバー関数を呼び出してデータグラムを受信し、ソース アドレスを SOCKADDR
構造体または rSocketAddress
に格納します (IPv6 アドレスを処理します)。
int ReceiveFromEx(
void* lpBuf,
int nBufLen,
CString& rSocketAddress,
UINT& rSocketPort,
int nFlags = 0);
パラメーター
lpBuf
受信データのバッファー。
nBufLen
lpBuf
の長さ (バイト単位)。
rSocketAddress
ドット番号の IP アドレスを受け取る CString
オブジェクトへの参照。
rSocketPort
ポートを格納する UINT
への参照。
nFlags
呼び出しを行う方法を指定します。 この関数のセマンティクスは、ソケット オプションと nFlags
パラメーターによって決まります。 後者は、次のいずれかの値を C++ ビットごとの OR 演算子 (|
) と組み合わせることによって構築されます。
MSG_PEEK
受信データをピークします。 データはバッファーにコピーされますが、入力キューからは削除されません。MSG_OOB
帯域外データを処理します。
戻り値
エラーが発生しなかった場合、 ReceiveFromEx
は受信したバイト数を返します。 接続が閉じられている場合は、0 を返します。 それ以外の場合は、 SOCKET_ERROR
の値が返され、 GetLastError
を呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。
WSANOTINITIALISED
この API を使用する前に、正常なAfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEFAULT
lpSockAddrLen
引数が無効です。lpSockAddr
バッファーが小さすぎてピア アドレスに対応できませんでした。WSAEINPROGRESS
Windows ソケットのブロック操作が進行中です。WSAEINVAL
ソケットがBind
にバインドされていません。WSAENOTCONN
ソケットが接続されていません (SOCK_STREAM
のみ)。WSAENOTSOCK
記述子はソケットではありません。WSAEOPNOTSUPP
MSG_OOB
が指定されましたが、ソケットがSOCK_STREAM
型ではありません。WSAESHUTDOWN
ソケットがシャットダウンされました。nHow
を 0 または 2 に設定してShutDown
が呼び出された後、ソケットでReceiveFromEx
を呼び出すことはできません。WSAEWOULDBLOCK
ソケットは非ブロッキングとしてマークされ、ReceiveFromEx
操作はブロックされます。WSAEMSGSIZE
データグラムが大きすぎて指定されたバッファーに収まりきれず、切り捨てられました。WSAECONNABORTED
タイムアウトまたはその他の障害により、仮想回線が中止されました。WSAECONNRESET
リモート側で仮想回線がリセットされました。
解説
この関数は、(接続されている可能性がある) ソケット上の受信データを読み取り、データの送信元のアドレスをキャプチャするために使用されます。
この関数は、IPv6 アドレスと古いプロトコルを処理する点を除き、 CAsyncSocket::ReceiveFrom
と同じです。
SOCK_STREAM
型のソケットの場合、指定されたバッファーのサイズまで、現在使用可能な限り多くの情報が返されます。 ソケットが帯域外データ (ソケット オプション SO_OOBINLINE
) のインライン受信用に構成されており、帯域外データが未読の場合は、帯域外データのみが返されます。 アプリケーションは、 IOCtlSIOCATMARK
オプションまたは OnOutOfBandData
を使用して、帯域外データを読み取る必要があるかどうかを判断できます。 lpSockAddr
およびlpSockAddrLen
パラメーターは、SOCK_STREAM
ソケットでは無視されます。
データグラム ソケットの場合、最初にエンキューされたデータグラムから、指定されたバッファーのサイズまで、データが抽出されます。 データグラムが指定されたバッファーより大きい場合、バッファーはメッセージの最初の部分でいっぱいになり、余分なデータは失われ、ReceiveFromEx
はエラー コードがWSAEMSGSIZE
に設定されたSOCKET_ERROR
の値を返します。
lpSockAddr
が 0 以外で、ソケットが SOCK_DGRAM
型の場合、データを送信したソケットのネットワーク アドレスは、対応するSOCKADDR
構造体にコピーされます。 lpSockAddrLen
が指す値は、この構造体のサイズに初期化され、戻り時に変更され、そこに格納されているアドレスの実際のサイズを示します。 ソケットで受信データが使用できない場合、 ReceiveFromEx
呼び出しは、ソケットが非ブロッキングでない限り、データの到着を待機します。 この場合、エラー コードが WSAEWOULDBLOCK
に設定されたSOCKET_ERROR
の値が返されます。 OnReceive
コールバックを使用して、より多くのデータがいつ到着するかを判断できます。
ソケットが SOCK_STREAM
タイプで、リモート側が接続を正常にシャットダウンした場合、 ReceiveFromEx
はすぐに 0 バイトを受信して完了します。
CAsyncSocket::Send
接続されているソケットでデータを送信するには、このメンバー関数を呼び出します。
virtual int Send(
const void* lpBuf,
int nBufLen,
int nFlags = 0);
パラメーター
lpBuf
送信するデータを格納しているバッファー。
nBufLen
データの長さ (バイト単位) lpBuf
。
nFlags
呼び出しを行う方法を指定します。 この関数のセマンティクスは、ソケット オプションと nFlags
パラメーターによって決まります。 後者は、次のいずれかの値を C++ ビットごとの OR 演算子 (|
) と組み合わせることによって構築されます。
MSG_DONTROUTE
データをルーティングの対象にしないことを指定します。 Windows ソケット サプライヤーは、このフラグを無視することを選択できます。MSG_OOB
帯域外データの送信 (SOCK_STREAM
のみ)。
戻り値
エラーが発生しなかった場合、 Send
は送信された文字数の合計を返します。 (これは、 nBufLen
で示される数より小さい場合があることに注意してください)。それ以外の場合は、 SOCKET_ERROR
の値が返され、 GetLastError
を呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。
WSANOTINITIALISED
この API を使用する前に、正常なAfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEACCES
要求されたアドレスはブロードキャスト アドレスですが、適切なフラグが設定されていませんでした。WSAEINPROGRESS
Windows ソケットのブロック操作が進行中です。WSAEFAULT
lpBuf
引数は、ユーザー・アドレス・スペースの有効な部分にありません。WSAENETRESET
Windows ソケットの実装によって接続が削除されたため、接続をリセットする必要があります。WSAENOBUFS
Windows ソケットの実装は、バッファーのデッドロックを報告します。WSAENOTCONN
ソケットが接続されていません。WSAENOTSOCK
記述子はソケットではありません。WSAEOPNOTSUPP
MSG_OOB
が指定されましたが、ソケットがSOCK_STREAM
型ではありません。WSAESHUTDOWN
ソケットがシャットダウンされました。ShutDown
が 1 または 2 に設定nHow
呼び出された後、ソケットでSend
を呼び出すことはできません。WSAEWOULDBLOCK
ソケットは非ブロッキングとしてマークされ、要求された操作はブロックされます。WSAEMSGSIZE
ソケットはSOCK_DGRAM
型であり、データグラムは Windows ソケットの実装でサポートされている最大値を超えています。WSAEINVAL
ソケットがBind
にバインドされていません。WSAECONNABORTED
タイムアウトまたはその他の障害により、仮想回線が中止されました。WSAECONNRESET
リモート側で仮想回線がリセットされました。
解説
Send
は、接続されたストリームまたはデータグラム ソケットに送信データを書き込むのに使用されます。 データグラム ソケットの場合は、基になるサブネットの最大 IP パケット サイズを超えないように注意する必要があります。これは、AfxSocketInit
によって返されるWSADATA
構造体のiMaxUdpDg
要素によって与えられます。 データが長すぎて基になるプロトコルをアトミックに通過できない場合、エラー WSAEMSGSIZE
は GetLastError
経由で返され、データは送信されません。
データグラム ソケットの場合、 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
ソケットがシャットダウンされました。ShutDown
が 1 または 2 に設定nHow
呼び出された後、ソケットでSendTo
を呼び出すことはできません。WSAEWOULDBLOCK
ソケットは非ブロッキングとしてマークされ、要求された操作はブロックされます。WSAEMSGSIZE
ソケットはSOCK_DGRAM
型であり、データグラムは Windows ソケットの実装でサポートされている最大値を超えています。WSAECONNABORTED
タイムアウトまたはその他の障害により、仮想回線が中止されました。WSAECONNRESET
リモート側で仮想回線がリセットされました。WSAEADDRNOTAVAIL
指定されたアドレスは、ローカル コンピューターから使用できません。WSAEAFNOSUPPORT
指定されたファミリ内のアドレスは、このソケットでは使用できません。WSAEDESTADDRREQ
宛先アドレスが必要です。WSAENETUNREACH
現時点では、このホストからネットワークにアクセスできません。
解説
SendTo
は、データグラムまたはストリーム ソケットで使用され、ソケットに送信データを書き込むのに使用されます。 データグラム ソケットの場合は、基になるサブネットの最大 IP パケット サイズを超えないように注意する必要があります。これは、AfxSocketInit
によって入力されたWSADATA
構造体のiMaxUdpDg
要素によって提供されます。 データが長すぎて基になるプロトコルをアトミックに通過できない場合は、エラー WSAEMSGSIZE が返され、データは送信されません。
SendTo
が正常に完了しても、データが正常に配信されたことは示されません。
SendTo
は、lpSockAddr
パラメーターによって識別される特定のソケットにデータグラムを送信するために、SOCK_DGRAM
ソケットでのみ使用されます。
ブロードキャストを送信するには ( SOCK_DGRAM
のみ)、 lpSockAddr
パラメーターのアドレスは、特殊な IP アドレス INADDR_BROADCAST
(Windows ソケット ヘッダー ファイル WINSOCK.H
で定義) と目的のポート番号を使用して構築する必要があります。 または、 lpszHostAddress
パラメーターが NULL
されている場合、ソケットはブロードキャスト用に構成されます。 通常、ブロードキャスト データグラムが断片化が発生する可能性があるサイズを超えることはできません。つまり、データグラムのデータ部分 (ヘッダーを除く) は 512 バイトを超えないようにします。
IPv6 アドレスを処理するには、 CAsyncSocket::SendToEx
を使用します。
CAsyncSocket::SendToEx
このメンバー関数を呼び出して、特定の宛先にデータを送信します (IPv6 アドレスを処理します)。
int SendToEx(
const void* lpBuf,
int nBufLen,
UINT nHostPort,
LPCTSTR lpszHostAddress = NULL,
int nFlags = 0);
パラメーター
lpBuf
送信するデータを格納しているバッファー。
nBufLen
データの長さ (バイト単位) lpBuf
。
nHostPort
ソケット アプリケーションを識別するポート。
lpszHostAddress
このオブジェクトが接続されているソケットのネットワーク アドレス: "ftp.microsoft.com" などのマシン名、または "128.56.22.8" などの点線の番号。
nFlags
呼び出しを行う方法を指定します。 この関数のセマンティクスは、ソケット オプションと nFlags
パラメーターによって決まります。 後者は、次のいずれかの値を C++ ビットごとの OR 演算子 (|
) と組み合わせることによって構築されます。
MSG_DONTROUTE
データをルーティングの対象にしないことを指定します。 Windows ソケット サプライヤーは、このフラグを無視することを選択できます。MSG_OOB
帯域外データの送信 (SOCK_STREAM
のみ)。
戻り値
エラーが発生しなかった場合、 SendToEx
は送信された文字数の合計を返します。 (これは、 nBufLen
で示される数より小さい場合があることに注意してください)。それ以外の場合は、 SOCKET_ERROR
の値が返され、 GetLastError
を呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。
WSANOTINITIALISED
この API を使用する前に、正常なAfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEACCES
要求されたアドレスはブロードキャスト アドレスですが、適切なフラグが設定されていませんでした。WSAEINPROGRESS
Windows ソケットのブロック操作が進行中です。WSAEFAULT
lpBuf
またはlpSockAddr
パラメーターがユーザー アドレス空間の一部ではないか、lpSockAddr
引数が小さすぎます (SOCKADDR
構造体のサイズより小さい)。WSAEINVAL
ホスト名が無効です。WSAENETRESET
Windows ソケットの実装によって接続が削除されたため、接続をリセットする必要があります。WSAENOBUFS
Windows ソケットの実装は、バッファーのデッドロックを報告します。WSAENOTCONN
ソケットが接続されていません (SOCK_STREAM
のみ)。WSAENOTSOCK
記述子はソケットではありません。WSAEOPNOTSUPP
MSG_OOB
が指定されましたが、ソケットがSOCK_STREAM
型ではありません。WSAESHUTDOWN
ソケットがシャットダウンされました。ShutDown
が 1 または 2 に設定nHow
呼び出された後、ソケットでSendToEx
を呼び出すことはできません。WSAEWOULDBLOCK
ソケットは非ブロッキングとしてマークされ、要求された操作はブロックされます。WSAEMSGSIZE
ソケットはSOCK_DGRAM
型であり、データグラムは Windows ソケットの実装でサポートされている最大値を超えています。WSAECONNABORTED
タイムアウトまたはその他の障害により、仮想回線が中止されました。WSAECONNRESET
リモート側で仮想回線がリセットされました。WSAEADDRNOTAVAIL
指定されたアドレスは、ローカル コンピューターから使用できません。WSAEAFNOSUPPORT
指定されたファミリ内のアドレスは、このソケットでは使用できません。WSAEDESTADDRREQ
宛先アドレスが必要です。WSAENETUNREACH
現時点では、このホストからネットワークにアクセスできません。
解説
この方法は、IPv6 アドレスと古いプロトコルを処理する点を除き、 CAsyncSocket::SendTo
と同じです。
SendToEx
は、データグラムまたはストリーム ソケットで使用され、ソケットに送信データを書き込むのに使用されます。 データグラム ソケットの場合は、基になるサブネットの最大 IP パケット サイズを超えないように注意する必要があります。これは、AfxSocketInit
によって入力されたWSADATA
構造体のiMaxUdpDg
要素によって提供されます。 データが長すぎて基になるプロトコルをアトミックに通過できない場合は、エラー WSAEMSGSIZE
が返され、データは送信されません。
SendToEx
が正常に完了しても、データが正常に配信されたことは示されません。
SendToEx
は、lpSockAddr
パラメーターによって識別される特定のソケットにデータグラムを送信するために、SOCK_DGRAM
ソケットでのみ使用されます。
ブロードキャストを送信するには ( SOCK_DGRAM
のみ)、 lpSockAddr
パラメーターのアドレスは、特殊な IP アドレス INADDR_BROADCAST
(Windows ソケット ヘッダー ファイル WINSOCK.H
で定義) と目的のポート番号を使用して構築する必要があります。 または、 lpszHostAddress
パラメーターが NULL
されている場合、ソケットはブロードキャスト用に構成されます。 通常、ブロードキャスト データグラムが断片化が発生する可能性があるサイズを超えることはできません。つまり、データグラムのデータ部分 (ヘッダーを除く) は 512 バイトを超えないようにします。
CAsyncSocket::SetSockOpt
ソケット オプションを設定するには、このメンバー関数を呼び出します。
BOOL SetSockOpt(
int nOptionName,
const void* lpOptionValue,
int nOptionLen,
int nLevel = SOL_SOCKET);
パラメーター
nOptionName
値を設定するソケット オプション。
lpOptionValue
要求されたオプションの値が指定されるバッファーへのポインター。
nOptionLen
lpOptionValue
バッファーのサイズ (バイト単位)。
nLevel
オプションが定義されているレベル。サポートされているレベルは、 SOL_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 ソケットの実装に通知するには、アプリケーションは、Bind
呼び出しを発行する前に、ソケットのSO_REUSEADDR
ソケット オプションを設定する必要があります。 オプションは、 Bind
呼び出し時にのみ解釈されることに注意してください。したがって、既存のアドレスにバインドされていないソケットにオプションを設定することは不要です (ただし無害です)。また、 Bind
呼び出し後にオプションを設定またはリセットしても、このソケットやその他のソケットには影響しません。
アプリケーションは、 SO_KEEPALIVE
ソケット オプションをオンにすることで、Windows ソケットの実装で伝送制御プロトコル (TCP) 接続で "キープアライブ" パケットの使用を有効にすることを要求できます。 Windows ソケットの実装では、キープアライブの使用をサポートする必要はありません。有効な場合、正確なセマンティクスは実装固有ですが、RFC 1122 のセクション 4.2.3.6"インターネット ホストの要件 — 通信層" に準拠する必要があります。"キープアライブ" の結果として接続が切断された場合、エラー コード WSAENETRESET
はソケットで進行中のすべての呼び出しに返され、後続の呼び出しは WSAENOTCONN
で失敗します。
TCP_NODELAY
オプションを使用すると、Nagle アルゴリズムが無効になります。 Nagle アルゴリズムは、フル サイズのパケットを送信できるようになるまで未確認の送信データをバッファリングすることで、ホストによって送信される小さなパケットの数を減らすために使用されます。 ただし、一部のアプリケーションでは、このアルゴリズムによってパフォーマンスが低下する可能性があり、 TCP_NODELAY
を使用して無効にすることができます。 アプリケーション ライターは、TCP_NODELAY
の設定がネットワーク パフォーマンスに大きな悪影響を及ぼす可能性があるため、その影響が十分に理解され、必要でない限り、TCP_NODELAY
を設定しないでください。 TCP_NODELAY
は、レベル IPPROTO_TCP
を使用する唯一のサポートされているソケット オプションです。他のすべてのオプションでは、レベル SOL_SOCKET
を使用します。
SO_DEBUG
オプションがアプリケーションによって設定されている場合、Windows ソケットの一部の実装では出力デバッグ情報が提供されます。
SetSockOpt
では、次のオプションがサポートされています。 Type は、 lpOptionValue
によってアドレス指定されたデータの型を識別します。
値 | Type | 説明 |
---|---|---|
SO_BROADCAST |
BOOL |
ソケットでのブロードキャスト メッセージの送信を許可します。 |
SO_DEBUG |
BOOL |
デバッグ情報を記録します。 |
SO_DONTLINGER |
BOOL |
送信されていないデータの送信を待機している Close をブロックしないでください。 このオプションを設定することは、l_onoff を 0 に設定したSO_LINGER を設定することと同じです。 |
SO_DONTROUTE |
BOOL |
ルーティングしない: インターフェイスに直接送信します。 |
SO_KEEPALIVE |
BOOL |
キープアライブを送信します。 |
SO_LINGER |
struct LINGER |
未 Close データが存在する場合は残ります。 |
SO_OOBINLINE |
BOOL |
通常のデータ ストリームで帯域外データを受信します。 |
SO_RCVBUF |
int |
受信のバッファー サイズを指定します。 |
SO_REUSEADDR |
BOOL |
ソケットが既に使用されているアドレスにバインドされるようにします。 ( を参照してくださいバインド.) |
SO_SNDBUF |
int |
送信のバッファー サイズを指定します。 |
TCP_NODELAY |
BOOL |
送信結合用の Nagle アルゴリズムを無効にします。 |
SetSockOpt
でサポートされていないバークレイ ソフトウェアディストリビューション (BSD) オプションは次のとおりです。
値 | Type | 説明 |
---|---|---|
SO_ACCEPTCONN |
BOOL |
ソケットがリッスンしています |
SO_ERROR |
int |
エラーの状態を取得し、クリアします。 |
SO_RCVLOWAT |
int |
低いウォーターマークを受け取ります。 |
SO_RCVTIMEO |
int |
受信タイムアウト |
SO_SNDLOWAT |
int |
低いウォーター マークを送信します。 |
SO_SNDTIMEO |
int |
送信タイムアウト。 |
SO_TYPE |
int |
ソケットの種類。 |
IP_OPTIONS |
IP ヘッダーのオプション フィールドを設定します。 |
CAsyncSocket::ShutDown
このメンバー関数を呼び出して、ソケットでの送信、受信、またはその両方を無効にします。
BOOL ShutDown(int nHow = sends);
パラメーター
nHow
次の列挙値を使用して、許可されなくなった操作の種類を示すフラグ。
receives = 0
sends = 1
both = 2
戻り値
関数が成功した場合は 0 以外。それ以外の場合は 0 で、 GetLastError
を呼び出すことによって特定のエラー コードを取得できます。 このメンバー関数には、次のエラーが適用されます。
WSANOTINITIALISED
この API を使用する前に、正常なAfxSocketInit
が発生する必要があります。WSAENETDOWN
Windows ソケットの実装で、ネットワーク サブシステムが失敗したことを検出しました。WSAEINVAL
nHow
が無効です。WSAEINPROGRESS
Windows ソケットのブロック操作が進行中です。WSAENOTCONN
ソケットが接続されていません (SOCK_STREAM
のみ)。WSAENOTSOCK
記述子はソケットではありません。
解説
ShutDown
は、受信、伝送、またはその両方を無効にするために、すべてのタイプのソケットで使用されます。 nHow
が 0 の場合、ソケットでの後続の受信は許可されません。 これは、下位のプロトコル レイヤーには影響しません。
伝送制御プロトコル (TCP) の場合、TCP ウィンドウは変更されず、ウィンドウが使い果たされるまで受信データは受け入れられます (ただし、確認されません)。 ユーザー データグラム プロトコル (UDP) の場合、受信データグラムが受け入れられ、キューに入れられます。 ICMP エラー パケットは生成されません。 nHow
が 1 の場合、後続の送信は許可されません。 TCP ソケットの場合、FIN が送信されます。 nHow
を 2 に設定すると、上記のように送受信の両方が無効になります。
ShutDown
はソケットを閉じず、ソケットに接続されているリソースは、Close
が呼び出されるまで解放されないことに注意してください。 アプリケーションは、シャットダウン後にソケットを再利用できることに依存しないようにする必要があります。 特に、このようなソケットでの Connect
の使用をサポートするために、Windows ソケットの実装は必要ありません。
例
CAsyncSocket::OnReceive
の例を参照してください。
CASyncSocket::Socket
ソケット ハンドルを割り当てます。
BOOL Socket(
int nSocketType = SOCK_STREAM,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
int nProtocolType = 0,
int nAddressFormat = PF_INET);
パラメーター
nSocketType
SOCK_STREAM
またはSOCK_DGRAM
を指定します。
lEvent
アプリケーションが関心を持つネットワーク イベントの組み合わせを指定するビットマスク。
FD_READ
: 読み取り準備の通知を受け取りたい。FD_WRITE
: 書き込み準備の通知を受け取りたい。FD_OOB
: 帯域外データの到着通知を受け取りたい。FD_ACCEPT
: 受信接続の通知を受信する必要があります。FD_CONNECT
: 完了した接続の通知を受け取りたい。FD_CLOSE
:ソケットクロージャの通知を受け取りたい。
nProtocolType
指定されたアドレス ファミリに固有のソケットで使用されるプロトコル。
nAddressFormat
アドレス ファミリの仕様。
戻り値
正常に終了した場合は、TRUE
を返します。それ以外の場合は、FALSE
を返します。
解説
このメソッドは、ソケット ハンドルを割り当てます。 ソケットを指定したアドレスにバインドするために CAsyncSocket::Bind
を呼び出さないため、後で Bind
を呼び出して、指定したアドレスにソケットをバインドする必要があります。 CAsyncSocket::SetSockOpt
を使用して、バインドする前にソケット オプションを設定できます。