CSocket クラスCSocket Class

は、から派生し CAsyncSocket 、Windows ソケット API のカプセル化を継承し、オブジェクトよりも高い抽象化レベルを表し CAsyncSocket ます。Derives from CAsyncSocket, inherits its encapsulation of the Windows Sockets API, and represents a higher level of abstraction than that of a CAsyncSocket object.

構文Syntax

class CSocket : public CAsyncSocket

メンバーMembers

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

名前Name 説明Description
CSocket:: CSocketCSocket::CSocket CSocket オブジェクトを構築します。Constructs a CSocket object.

パブリック メソッドPublic Methods

名前Name 説明Description
CSocket:: AttachCSocket::Attach ソケットハンドルをオブジェクトにアタッチ CSocket します。Attaches a SOCKET handle to a CSocket object.
CSocket:: CancelBlockingCallCSocket::CancelBlockingCall 現在実行中のブロッキング呼び出しをキャンセルします。Cancels a blocking call that is currently in progress.
CSocket:: CreateCSocket::Create ソケットを作成します。Creates a socket.
CSocket:: FromHandleCSocket::FromHandle CSocketソケットハンドルを指定して、オブジェクトへのポインターを返します。Returns a pointer to a CSocket object, given a SOCKET handle.
CSocket:: IsBlockingCSocket::IsBlocking ブロック呼び出しが進行中かどうかを判断します。Determines whether a blocking call is in progress.

プロテクト メソッドProtected Methods

名前Name 説明Description
CSocket:: OnMessagePendingCSocket::OnMessagePending ブロック呼び出しの完了を待機している間、保留中のメッセージを処理するために呼び出されます。Called to process pending messages while waiting for a blocking call to complete.

解説Remarks

CSocket は、クラス CSocketFile と連携し CArchive 、データの送受信を管理します。CSocket works with classes CSocketFile and CArchive to manage the sending and receiving of data.

また、オブジェクトには CSocket 、の同期操作に不可欠なブロッキングも用意されて CArchive います。A CSocket object also provides blocking, which is essential to the synchronous operation of CArchive. Receive、、 Send ReceiveFromSendTo 、および Accept (から継承されたすべての) のブロック関数 CAsyncSocket は、ではエラーを返しません WSAEWOULDBLOCK CSocketBlocking functions, such as Receive, Send, ReceiveFrom, SendTo, and Accept (all inherited from CAsyncSocket), do not return a WSAEWOULDBLOCK error in CSocket. 代わりに、これらの関数は、操作が完了するまで待機します。Instead, these functions wait until the operation completes. また、 CancelBlockingCall これらの関数のいずれかがブロックされているときにが呼び出された場合、元の呼び出しはエラー WSAEINTR で終了します。Additionally, the original call will terminate with the error WSAEINTR if CancelBlockingCall is called while one of these functions is blocking.

オブジェクトを使用するには、 CSocket コンストラクターを呼び出した後、 Create を呼び出して、基になるソケットハンドル (型ソケット) を作成します。To use a CSocket object, call the constructor, then call Create to create the underlying SOCKET handle (type SOCKET). の既定のパラメーターでは、 Create ストリームソケットを作成しますが、オブジェクトでソケットを使用していない場合は、 CArchive 代わりに、パラメーターを指定してデータグラムソケットを作成するか、特定のポートにバインドしてサーバーソケットを作成することができます。The default parameters of Create create a stream socket, but if you are not using the socket with a CArchive object, you can specify a parameter to create a datagram socket instead, or bind to a specific port to create a server socket. クライアント Connect 側とサーバー側でを使用して、クライアントソケットに接続し Accept ます。Connect to a client socket using Connect on the client side and Accept on the server side. 次に、 CSocketFile オブジェクトを作成し、 CSocket コンストラクター内のオブジェクトに関連付け CSocketFile ます。Then create a CSocketFile object and associate it to the CSocket object in the CSocketFile constructor. 次に、 CArchive 送信用のオブジェクトとデータを受信するためのオブジェクトを作成し (必要に応じて)、 CSocketFile コンストラクター内のオブジェクトに関連付け CArchive ます。Next, create a CArchive object for sending and one for receiving data (as needed), then associate them with the CSocketFile object in the CArchive constructor. 通信が完了したら、、、の各オブジェクトを破棄 CArchive CSocketFile CSocket します。When communications are complete, destroy the CArchive, CSocketFile, and CSocket objects. ソケットデータ型については、「 Windows Sockets: Background」を参照してください。The SOCKET data type is described in the article Windows Sockets: Background.

とを一緒に使用すると CArchive CSocketFile CSocketCSocket::Receive によって () によって PumpMessages(FD_READ) 要求されたバイト数の待機が開始される状況が発生する可能性があります。When you use CArchive with CSocketFile and CSocket, you might encounter a situation where CSocket::Receive enters a loop (by PumpMessages(FD_READ)) waiting for the requested amount of bytes. これは、Windows sockets では FD_READ 通知ごとに1つの recv 呼び出しのみが許可されていますが、 CSocketFile FD_READ ごとに複数の recv 呼び出しが許可されているためです CSocketThis is because Windows sockets allow only one recv call per FD_READ notification, but CSocketFile and CSocket allow multiple recv calls per FD_READ. 読み取るデータが存在しない場合に FD_READ を取得すると、アプリケーションがハングします。If you get an FD_READ when there is no data to read, the application hangs. 別の FD_READ が得られない場合、アプリケーションはソケット経由の通信を停止します。If you never get another FD_READ, the application stops communicating over the socket.

この問題は、次のように解決できます。You can resolve this problem as follows. OnReceiveソケットクラスのメソッドで、 CAsyncSocket::IOCtl(FIONREAD, ...) Serialize ソケットから読み取られると予想されるデータが1つの TCP パケット (ネットワークメディアの最大転送単位 (通常は1096バイト以上)) のサイズを超えたときに、メッセージクラスのメソッドを呼び出す前に、を呼び出します。In the OnReceive method of your socket class, call CAsyncSocket::IOCtl(FIONREAD, ...) before you call the Serialize method of your message class when the expected data to be read from the socket exceeds the size of one TCP packet (maximum transmission unit of the network medium, usually at least 1096 bytes). 使用可能なデータのサイズが必要以上に満たない場合は、すべてのデータが受信されるのを待ってから、読み取り操作を開始します。If the size of the available data is less than needed, wait for all the data to be received and only then start the read operation.

次の例で m_dwExpected は、は、ユーザーが受け取ると予想されるおおよそのバイト数です。In the following example, m_dwExpected is the approximate number of bytes that the user expects to receive. コード内の他の場所で宣言することを前提としています。It is assumed that you declare it elsewhere in your code.

void CChatSocket::OnReceive(int nErrorCode)
{
   CSocket::OnReceive(nErrorCode);

   DWORD dwReceived;

   if (IOCtl(FIONREAD, &dwReceived))
   {
      if (dwReceived >= m_dwExpected) // Process only if you have enough data
         m_pDoc->ProcessPendingRead();
   }
   else
   {
      // Error handling here
   }
}

注意

静的にリンクされた MFC アプリケーションでセカンダリスレッドで MFC ソケットを使用する場合は、ソケット AfxSocketInit ライブラリを初期化するためにソケットを使用する各スレッドでを呼び出す必要があります。When using MFC sockets in secondary threads in a statically linked MFC application, you must call AfxSocketInit in each thread that uses sockets to initialize the socket libraries. 既定で AfxSocketInit は、はプライマリスレッドでのみ呼び出されます。By default, AfxSocketInit is called only in the primary thread.

詳細については、「 MFC の Windows sockets」、「 Windows ソケット: アーカイブ付きソケットの使用」、「windows ソケット: アーカイブを使用するソケットの しくみ」、「windows ソケット: 操作のシーケンス」、「 Windows ソケット: アーカイブを使用するソケットの例」を参照してください。For more information, see Windows Sockets in MFC, Windows Sockets: Using Sockets with Archives, Windows Sockets: How Sockets with Archives Work, Windows Sockets: Sequence of Operations, Windows Sockets: Example of Sockets Using Archives.

継承階層Inheritance Hierarchy

CObjectCObject

CAsyncSocketCAsyncSocket

CSocket

要件Requirements

ヘッダー: afxsockHeader: afxsock.h

CSocket:: AttachCSocket::Attach

ハンドルをオブジェクトにアタッチするには、このメンバー関数を呼び出し hSocket CSocket ます。Call this member function to attach the hSocket handle to a CSocket object.

BOOL Attach(SOCKET hSocket);

パラメーターParameters

hSockethSocket
ソケットを表すハンドルを格納します。Contains a handle to a socket.

戻り値Return Value

正常終了した場合は 0 以外を返します。Nonzero if the function is successful.

解説Remarks

ソケットハンドルは、オブジェクトの m_hSocket データメンバーに格納されます。The SOCKET handle is stored in the object's m_hSocket data member.

詳細については、「 Windows ソケット: アーカイブでのソケットの使用」を参照してください。For more information, see Windows Sockets: Using Sockets with Archives.

Example

class CSockThread : public CWinThread
{
public:
   SOCKET m_hConnected;

protected:
   CChatSocket m_sConnected;

   // remainder of class declaration omitted.
BOOL CSockThread::InitInstance()
{
   // Attach the socket object to the socket handle
   // in the context of this thread.
   m_sConnected.Attach(m_hConnected);
   m_hConnected = NULL;

   return TRUE;
}
// This listening socket has been constructed
// in the primary thread.
void CListeningSocket::OnAccept(int nErrorCode)
{
   UNREFERENCED_PARAMETER(nErrorCode);

   // This CSocket object is used just temporarily
   // to accept the incoming connection.
   CSocket sConnected;
   Accept(sConnected);

   // Start the other thread.
   CSockThread *pSockThread = (CSockThread*)AfxBeginThread(
       RUNTIME_CLASS(CSockThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
   if (NULL != pSockThread)
   {
      // Detach the newly accepted socket and save
      // the SOCKET handle in our new thread object.
      // After detaching it, it should no longer be
      // used in the context of this thread.
      pSockThread->m_hConnected = sConnected.Detach();
      pSockThread->ResumeThread();
   }
}

CSocket:: CancelBlockingCallCSocket::CancelBlockingCall

現在実行中のブロック呼び出しを取り消すには、このメンバー関数を呼び出します。Call this member function to cancel a blocking call currently in progress.

void CancelBlockingCall();

解説Remarks

この関数は、このソケットの未処理のブロッキング操作を取り消します。This function cancels any outstanding blocking operation for this socket. 元のブロック呼び出しは、エラー WSAEINTR でできるだけ早く終了します。The original blocking call will terminate as soon as possible with the error WSAEINTR.

ブロック操作の場合は、 Connect Windows ソケットの実装によってブロック呼び出しができるだけ早く終了しますが、接続が完了してからリセットされるか、タイムアウトになるまで、ソケットリソースが解放されない可能性があります。これは、アプリケーションが (ソケットが使用できない場合) 新しいソケットをすぐに開くか、同じピアに接続する場合にのみ、顕著になる可能性があります。In the case of a blocking Connect operation, the Windows Sockets implementation will terminate the blocking call as soon as possible, but it may not be possible for the socket resources to be released until the connection has completed (and then been reset) or timed out. This is likely to be noticeable only if the application immediately tries to open a new socket (if no sockets are available), or to connect to the same peer.

以外の操作を取り消す Accept と、ソケットは不確定状態のままになります。Canceling any operation other than Accept can leave the socket in an indeterminate state. アプリケーションがソケットでのブロック操作をキャンセルした場合、そのアプリケーションがソケットでの実行に依存できる操作は、の呼び出しだけです Close 。ただし、Windows ソケットの実装によっては、他の操作が機能する場合があります。If an application cancels a blocking operation on a socket, the only operation that the application can depend on being able to perform on the socket is a call to Close, although other operations may work on some Windows Sockets implementations. アプリケーションの移植性を最大にする場合は、キャンセル後の操作の実行に依存しないように注意する必要があります。If you desire maximum portability for your application, you must be careful not to depend on performing operations after a cancel.

詳細については、「 Windows ソケット: アーカイブでのソケットの使用」を参照してください。For more information, see Windows Sockets: Using Sockets with Archives.

CSocket:: CreateCSocket::Create

Socket オブジェクトを構築した後に create member 関数を呼び出して、Windows ソケットを作成し、それをアタッチします。Call the Create member function after constructing a socket object to create the Windows socket and attach it.

BOOL Create(
    UINT nSocketPort = 0,
    int nSocketType = SOCK_STREAM,
    LPCTSTR lpszSocketAddress = NULL);

パラメーターParameters

nSocketPortnSocketPort
ソケットで使用される特定のポート。 MFC でポートを選択する場合は0。A particular port to be used with the socket, or 0 if you want MFC to select a port.

nSocketTypenSocketType
SOCK_STREAM または SOCK_DGRAM。SOCK_STREAM or SOCK_DGRAM.

lpszSocketAddresslpszSocketAddress
接続されたソケットのネットワークアドレスを格納している文字列へのポインター ("128.56.22.8" など)。A pointer to a string containing the network address of the connected socket, a dotted number such as "128.56.22.8". このパラメーターに NULL 文字列を渡すと、 CSocket インスタンスはすべてのネットワークインターフェイスでクライアントアクティビティをリッスンする必要があることを示します。Passing the NULL string for this parameter indicates the CSocket instance should listen for client activity on all network interfaces.

戻り値Return Value

関数が成功した場合は0以外の。それ以外の場合は0。を呼び出すと、特定のエラーコードを取得でき GetLastError ます。Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError.

解説Remarks

CreateBind に、を呼び出して、ソケットを指定されたアドレスにバインドします。Create then calls Bind to bind the socket to the specified address. 次のソケットの種類がサポートされています。The following socket types are supported:

  • SOCK_STREAM は、シーケンス、信頼性、双方向の、接続ベースのバイトストリームを提供します。SOCK_STREAM Provides sequenced, reliable, two-way, connection-based byte streams. は、インターネットアドレスファミリに伝送制御プロトコル (TCP) を使用します。Uses Transmission Control Protocol (TCP) for the Internet address family.

  • SOCK_DGRAM は、固定された (通常は小さい) 最大長の、コネクションレスで信頼性の低いバッファーであるデータグラムをサポートします。SOCK_DGRAM Supports datagrams, which are connectionless, unreliable buffers of a fixed (typically small) maximum length. は、インターネットアドレスファミリにユーザーデータグラムプロトコル (UDP) を使用します。Uses User Datagram Protocol (UDP) for the Internet address family. このオプションを使用するには、オブジェクトでソケットを使用しないようにする必要があり CArchive ます。To use this option, you must not use the socket with a CArchive object.

    注意

    この Accept メンバー関数は、新しい空のオブジェクトへの参照を CSocket そのパラメーターとして受け取ります。The Accept member function takes a reference to a new, empty CSocket object as its parameter. を呼び出す前に、このオブジェクトを作成する必要があり Accept ます。You must construct this object before you call Accept. このソケットオブジェクトがスコープ外に出ると、接続が閉じられることに注意してください。Keep in mind that if this socket object goes out of scope, the connection closes. Createこの新しいソケットオブジェクトに対してを呼び出さないでください。Do not call Create for this new socket object.

ストリームソケットとデータグラムソケットの詳細については、「 Windows ソケット: バックグラウンド」、「 Windows ソケット: ポートとソケットアドレス」、および「 Windows ソケット: アーカイブ付きソケットの使用」を参照してください。For more information about stream and datagram sockets, see the articles Windows Sockets: Background, Windows Sockets: Ports and Socket Addresses, and Windows Sockets: Using Sockets with Archives.

CSocket:: CSocketCSocket::CSocket

CSocket オブジェクトを構築します。Constructs a CSocket object.

CSocket();

解説Remarks

構築後、メンバー関数を呼び出す必要があり Create ます。After construction, you must call the Create member function.

詳細については、「 Windows ソケット: アーカイブでのソケットの使用」を参照してください。For more information, see Windows Sockets: Using Sockets with Archives.

CSocket:: FromHandleCSocket::FromHandle

オブジェクトへのポインターを返し CSocket ます。Returns a pointer to a CSocket object.

static CSocket* PASCAL FromHandle(SOCKET hSocket);

パラメーターParameters

hSockethSocket
ソケットを表すハンドルを格納します。Contains a handle to a socket.

戻り値Return Value

オブジェクトへのポインター CSocket CSockethsocket にアタッチされたオブジェクトがない場合は NULL。A pointer to a CSocket object, or NULL if there is no CSocket object attached to hSocket.

解説Remarks

ソケットハンドルが指定されている場合、 CSocket オブジェクトがハンドルにアタッチされていない場合、メンバー関数は NULL を返し、一時オブジェクトを作成しません。When given a SOCKET handle, if a CSocket object is not attached to the handle, the member function returns NULL and does not create a temporary object.

詳細については、「 Windows ソケット: アーカイブでのソケットの使用」を参照してください。For more information, see Windows Sockets: Using Sockets with Archives.

CSocket:: IsBlockingCSocket::IsBlocking

ブロック呼び出しが進行中かどうかを判断するには、このメンバー関数を呼び出します。Call this member function to determine if a blocking call is in progress.

BOOL IsBlocking();

戻り値Return Value

ソケットがブロックしている場合は0以外。それ以外の場合は0です。Nonzero if the socket is blocking; otherwise 0.

解説Remarks

詳細については、「 Windows ソケット: アーカイブでのソケットの使用」を参照してください。For more information, see Windows Sockets: Using Sockets with Archives.

CSocket:: OnMessagePendingCSocket::OnMessagePending

このメンバー関数をオーバーライドして、Windows から特定のメッセージを検索し、ソケット内の特定のメッセージに応答します。Override this member function to look for particular messages from Windows and respond to them in your socket.

virtual BOOL OnMessagePending();

戻り値Return Value

メッセージが処理された場合は0以外の。それ以外の場合は0です。Nonzero if the message was handled; otherwise 0.

解説Remarks

これは高度なオーバーライド可能です。This is an advanced overridable.

このフレームワークは、 OnMessagePending ソケットが Windows メッセージをポンプしている間にを呼び出し、アプリケーションに関連するメッセージを処理する機会を提供します。The framework calls OnMessagePending while the socket is pumping Windows messages to give you an opportunity to deal with messages of interest to your application. の使用方法の例につい OnMessagePending ては、「 Windows ソケット: ソケットクラスからの派生」を参照してください。For examples of how you might use OnMessagePending, see the article Windows Sockets: Deriving from Socket Classes.

詳細については、「 Windows ソケット: アーカイブでのソケットの使用」を参照してください。For more information, see Windows Sockets: Using Sockets with Archives.

関連項目See also

CAsyncSocket クラスCAsyncSocket Class
階層図Hierarchy Chart
CAsyncSocket クラスCAsyncSocket Class
CSocketFile クラスCSocketFile Class