Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Represents a Windows Socket — an endpoint of network communication.
Syntax
class CAsyncSocket : public CObject
Members
Public Constructors
| Name | Description |
|---|---|
CAsyncSocket::CAsyncSocket |
Constructs a CAsyncSocket object. |
Public Methods
| Name | Description |
|---|---|
CAsyncSocket::Accept |
Accepts a connection on the socket. |
CAsyncSocket::AsyncSelect |
Requests event notification for the socket. |
CAsyncSocket::Attach |
Attaches a socket handle to a CAsyncSocket object. |
CAsyncSocket::Bind |
Associates a local address with the socket. |
CAsyncSocket::Close |
Closes the socket. |
CAsyncSocket::Connect |
Establishes a connection to a peer socket. |
CAsyncSocket::Create |
Creates a socket. |
CAsyncSocket::CreateEx |
Creates a socket with advanced options. |
CAsyncSocket::Detach |
Detaches a socket handle from a CAsyncSocket object. |
CAsyncSocket::FromHandle |
Returns a pointer to a CAsyncSocket object, given a socket handle. |
CAsyncSocket::GetLastError |
Gets the error status for the last operation that failed. |
CAsyncSocket::GetPeerName |
Gets the address of the peer socket to which the socket is connected. |
CAsyncSocket::GetPeerNameEx |
Gets the address of the peer socket to which the socket is connected (handles IPv6 addresses). |
CAsyncSocket::GetSockName |
Gets the local name for a socket. |
CAsyncSocket::GetSockNameEx |
Gets the local name for a socket (handles IPv6 addresses). |
CAsyncSocket::GetSockOpt |
Retrieves a socket option. |
CAsyncSocket::IOCtl |
Controls the mode of the socket. |
CAsyncSocket::Listen |
Establishes a socket to listen for incoming connection requests. |
CAsyncSocket::Receive |
Receives data from the socket. |
CAsyncSocket::ReceiveFrom |
Receives a datagram and stores the source address. |
CAsyncSocket::ReceiveFromEx |
Receives a datagram and stores the source address (handles IPv6 addresses). |
CAsyncSocket::Send |
Sends data to a connected socket. |
CAsyncSocket::SendTo |
Sends data to a specific destination. |
CAsyncSocket::SendToEx |
Sends data to a specific destination (handles IPv6 addresses). |
CAsyncSocket::SetSockOpt |
Sets a socket option. |
CAsyncSocket::ShutDown |
Disables Send and/or Receive calls on the socket. |
CASyncSocket::Socket |
Allocates a socket handle. |
Protected Methods
| Name | Description |
|---|---|
CAsyncSocket::OnAccept |
Notifies a listening socket that it can accept pending connection requests by calling Accept. |
CAsyncSocket::OnClose |
Notifies a socket that the socket connected to it has closed. |
CAsyncSocket::OnConnect |
Notifies a connecting socket that the connection attempt is complete, whether successfully or in error. |
CAsyncSocket::OnOutOfBandData |
Notifies a receiving socket that there is out-of-band data to be read on the socket, usually an urgent message. |
CAsyncSocket::OnReceive |
Notifies a listening socket that there is data to be retrieved by calling Receive. |
CAsyncSocket::OnSend |
Notifies a socket that it can send data by calling Send. |
Public Operators
| Name | Description |
|---|---|
| CAsyncSocket::operator = | Assigns a new value to a CAsyncSocket object. |
| CAsyncSocket::operator SOCKET | Use this operator to retrieve the SOCKET handle of the CAsyncSocket object. |
Public Data Members
| Name | Description |
|---|---|
CAsyncSocket::m_hSocket |
Indicates the SOCKET handle attached to this CAsyncSocket object. |
Remarks
Class CAsyncSocket encapsulates the Windows Socket Functions API, providing an object-oriented abstraction for programmers who want to use Windows Sockets in conjunction with MFC.
This class is based on the assumption that you understand network communications. You are responsible for handling blocking, byte-order differences, and conversions between Unicode and multibyte character set (MBCS) strings. If you want a more convenient interface that manages these issues for you, see class CSocket.
To use a CAsyncSocket object, call its constructor, then call the Create function to create the underlying socket handle (type SOCKET), except on accepted sockets. For a server socket call the Listen member function, and for a client socket call the Connect member function. The server socket should call the Accept function upon receiving a connection request. Use the remaining CAsyncSocket functions to carry out communications between sockets. Upon completion, destroy the CAsyncSocket object if it was created on the heap; the destructor automatically calls the Close function. The SOCKET data type is described in the article Windows Sockets: Background.
Note
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. By default, AfxSocketInit is called only in the primary thread.
For more information, see Windows Sockets: Using Class CAsyncSocket and related articles., as well as Windows Sockets 2 API.
Inheritance Hierarchy
CAsyncSocket
Requirements
Header: afxsock.h
CAsyncSocket::Accept
Call this member function to accept a connection on a socket.
virtual BOOL Accept(
CAsyncSocket& rConnectedSocket,
SOCKADDR* lpSockAddr = NULL,
int* lpSockAddrLen = NULL);
Parameters
rConnectedSocket
A reference identifying a new socket that is available for connection.
lpSockAddr
A pointer to a SOCKADDR structure that receives the address of the connecting socket, as known on the network. The exact format of the lpSockAddr argument is determined by the address family established when the socket was created. If lpSockAddr and/or lpSockAddrLen are equal to NULL, then no information about the remote address of the accepted socket is returned.
lpSockAddrLen
A pointer to the length of the address in lpSockAddr in bytes. The lpSockAddrLen is a value-result parameter: it should initially contain the amount of space pointed to by lpSockAddr; on return it will contain the actual length (in bytes) of the address returned.
Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEFAULTThelpSockAddrLenargument is too small (less than the size of aSOCKADDRstructure).WSAEINPROGRESSA blocking Windows Sockets call is in progress.WSAEINVALListenwas not invoked prior to accept.WSAEMFILEThe queue is empty upon entry to accept and there are no descriptors available.WSAENOBUFSNo buffer space is available.WSAENOTSOCKThe descriptor is not a socket.WSAEOPNOTSUPPThe referenced socket is not a type that supports connection-oriented service.WSAEWOULDBLOCKThe socket is marked as nonblocking and no connections are present to be accepted.
Remarks
This routine extracts the first connection in the queue of pending connections, creates a new socket with the same properties as this socket, and attaches it to rConnectedSocket. If no pending connections are present on the queue, Accept returns zero and GetLastError returns an error. The accepted socket (rConnectedSocket) cannot be used to accept more connections. The original socket remains open and listening.
The argument lpSockAddr is a result parameter that is filled in with the address of the connecting socket, as known to the communications layer. Accept is used with connection-based socket types such as SOCK_STREAM.
CAsyncSocket::AsyncSelect
Call this member function to request event notification for a socket.
BOOL AsyncSelect(long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parameters
lEvent
A bitmask which specifies a combination of network events in which the application is interested.
FD_READWant to receive notification of readiness for reading.FD_WRITEWant to receive notification when data is available to be read.FD_OOBWant to receive notification of the arrival of out-of-band data.FD_ACCEPTWant to receive notification of incoming connections.FD_CONNECTWant to receive notification of connection results.FD_CLOSEWant to receive notification when a socket has been closed by a peer.
Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEINVALIndicates that one of the specified parameters was invalid.WSAEINPROGRESSA blocking Windows Sockets operation is in progress.
Remarks
This function is used to specify which MFC callback notification functions will be called for the socket. AsyncSelect automatically sets this socket to nonblocking mode. For more information, see the article Windows Sockets: Socket Notifications.
CAsyncSocket::Attach
Call this member function to attach the hSocket handle to an CAsyncSocket object.
BOOL Attach(
SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parameters
hSocket
Contains a handle to a socket.
lEvent
A bitmask which specifies a combination of network events in which the application is interested.
FD_READWant to receive notification of readiness for reading.FD_WRITEWant to receive notification when data is available to be read.FD_OOBWant to receive notification of the arrival of out-of-band data.FD_ACCEPTWant to receive notification of incoming connections.FD_CONNECTWant to receive notification of connection results.FD_CLOSEWant to receive notification when a socket has been closed by a peer.
Return Value
Nonzero if the function is successful.
Remarks
The SOCKET handle is stored in the object's m_hSocket data member.
CAsyncSocket::Bind
Call this member function to associate a local address with the socket.
BOOL Bind(
UINT nSocketPort,
LPCTSTR lpszSocketAddress = NULL);
BOOL Bind (
const SOCKADDR* lpSockAddr,
int nSockAddrLen);
Parameters
nSocketPort
The port identifying the socket application.
lpszSocketAddress
The network address, a dotted number such as "128.56.22.8". Passing the NULL string for this parameter indicates the CAsyncSocket instance should listen for client activity on all network interfaces.
lpSockAddr
A pointer to a SOCKADDR structure that contains the address to assign to this socket.
nSockAddrLen
The length of the address in lpSockAddr in bytes.
Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError. The following list covers a few of the errors that might be returned. For a complete list, see Windows Sockets Error Codes.
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEADDRINUSEThe specified address is already in use. (See theSO_REUSEADDRsocket option underSetSockOpt.)WSAEFAULTThenSockAddrLenargument is too small (less than the size of aSOCKADDRstructure).WSAEINPROGRESSA blocking Windows Sockets call is in progress.WSAEAFNOSUPPORTThe specified address family is not supported by this port.WSAEINVALThe socket is already bound to an address.WSAENOBUFSNot enough buffers available, too many connections.WSAENOTSOCKThe descriptor is not a socket.
Remarks
This routine is used on an unconnected datagram or stream socket, before subsequent Connect or Listen calls. Before it can accept connection requests, a listening server socket must select a port number and make it known to Windows Sockets by calling Bind. Bind establishes the local association (host address/port number) of the socket by assigning a local name to an unnamed socket.
CAsyncSocket::CAsyncSocket
Constructs a blank socket object.
CAsyncSocket();
Remarks
After constructing the object, you must call its Create member function to create the SOCKET data structure and bind its address. (On the server side of a Windows Sockets communication, when the listening socket creates a socket to use in the Accept call, you do not call Create for that socket.)
CAsyncSocket::Close
Closes the socket.
virtual void Close();
Remarks
This function releases the socket descriptor so that further references to it will fail with the error WSAENOTSOCK. If this is the last reference to the underlying socket, the associated naming information and queued data are discarded. The socket object's destructor calls Close for you.
For CAsyncSocket, but not for CSocket, the semantics of Close are affected by the socket options SO_LINGER and SO_DONTLINGER. For further information, see member function GetSockOpt.
CAsyncSocket::Connect
Call this member function to establish a connection to an unconnected stream or datagram socket.
BOOL Connect(
LPCTSTR lpszHostAddress,
UINT nHostPort);
BOOL Connect(
const SOCKADDR* lpSockAddr,
int nSockAddrLen);
Parameters
lpszHostAddress
The network address of the socket to which this object is connected: a machine name such as "ftp.microsoft.com", or a dotted number such as "128.56.22.8".
nHostPort
The port identifying the socket application.
lpSockAddr
A pointer to a SOCKADDR structure that contains the address of the connected socket.
nSockAddrLen
The length of the address in lpSockAddr in bytes.
Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError. If this indicates an error code of WSAEWOULDBLOCK, and your application is using the overridable callbacks, your application will receive an OnConnect message when the connect operation is complete. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEADDRINUSEThe specified address is already in use.WSAEINPROGRESSA blocking Windows Sockets call is in progress.WSAEADDRNOTAVAILThe specified address is not available from the local machine.WSAEAFNOSUPPORTAddresses in the specified family cannot be used with this socket.WSAECONNREFUSEDThe attempt to connect was rejected.WSAEDESTADDRREQA destination address is required.WSAEFAULTThenSockAddrLenargument is incorrect.WSAEINVALInvalid host address.WSAEISCONNThe socket is already connected.WSAEMFILENo more file descriptors are available.WSAENETUNREACHThe network cannot be reached from this host at this time.WSAENOBUFSNo buffer space is available. The socket cannot be connected.WSAENOTSOCKThe descriptor is not a socket.WSAETIMEDOUTAttempt to connect timed out without establishing a connection.WSAEWOULDBLOCKThe socket is marked as nonblocking and the connection cannot be completed immediately.
Remarks
If the socket is unbound, unique values are assigned to the local association by the system, and the socket is marked as bound. Note that if the address field of the name structure is all zeroes, Connect will return zero. To get extended error information, call the GetLastError member function.
For stream sockets (type SOCK_STREAM), an active connection is initiated to the foreign host. When the socket call completes successfully, the socket is ready to send/receive data.
For a datagram socket (type SOCK_DGRAM), a default destination is set, which will be used on subsequent Send and Receive calls.
CAsyncSocket::Create
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,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
LPCTSTR lpszSocketAddress = NULL);
Parameters
nSocketPort
A well-known port to be used with the socket, or 0 if you want Windows Sockets to select a port.
nSocketType
SOCK_STREAM or SOCK_DGRAM.
lEvent
A bitmask which specifies a combination of network events in which the application is interested.
FD_READWant to receive notification of readiness for reading.FD_WRITEWant to receive notification of readiness for writing.FD_OOBWant to receive notification of the arrival of out-of-band data.FD_ACCEPTWant to receive notification of incoming connections.FD_CONNECTWant to receive notification of completed connection.FD_CLOSEWant to receive notification of socket closure.
lpszSockAddress
A pointer to a string containing the network address of the connected socket, a dotted number such as "128.56.22.8". Passing the NULL string for this parameter indicates the CAsyncSocket instance should listen for client activity on all network interfaces.
Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEAFNOSUPPORTThe specified address family is not supported.WSAEINPROGRESSA blocking Windows Sockets operation is in progress.WSAEMFILENo more file descriptors are available.WSAENOBUFSNo buffer space is available. The socket cannot be created.WSAEPROTONOSUPPORTThe specified port is not supported.WSAEPROTOTYPEThe specified port is the wrong type for this socket.WSAESOCKTNOSUPPORTThe specified socket type is not supported in this address family.
Remarks
Create calls Socket and if successful, it calls Bind to bind the socket to the specified address. The following socket types are supported:
SOCK_STREAMProvides sequenced, reliable, full-duplex, connection-based byte streams. Uses the Transmission Control Protocol (TCP) for the Internet address family.SOCK_DGRAMSupports datagrams, which are connectionless, unreliable packets of a fixed (typically small) maximum length. Uses the User Datagram Protocol (UDP) for the Internet address family.Note
The
Acceptmember function takes a reference to a new, emptyCSocketobject as its parameter. You must construct this object before you callAccept. Keep in mind that if this socket object goes out of scope, the connection closes. Do not callCreatefor this new socket object.
Important
Create is not thread-safe. If you are calling it in a multi-threaded environment where it could be invoked simultaneously by different threads, be sure to protect each call with a mutex or other synchronization lock.
For more information about stream and datagram sockets, see the articles Windows Sockets: Background and Windows Sockets: Ports and Socket Addresses and Windows Sockets 2 API.
CAsyncSocket::CreateEx
Call the CreateEx member function after constructing a socket object to create the Windows socket and attach it.
Use this function when you need to supply advanced options such as the socket type.
BOOL CreateEx(
ADDRINFOT* pAI,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parameters
pAI
A pointer to a ADDRINFOT to hold socket info such as the family and socket type.
lEvent
A bitmask which specifies a combination of network events in which the application is interested.
FD_READWant to receive notification of readiness for reading.FD_WRITEWant to receive notification of readiness for writing.FD_OOBWant to receive notification of the arrival of out-of-band data.FD_ACCEPTWant to receive notification of incoming connections.FD_CONNECTWant to receive notification of completed connection.FD_CLOSEWant to receive notification of socket closure.
Return Value
See the return value for Create().
Remarks
See the remarks for Create().
CAsyncSocket::Detach
Call this member function to detach the SOCKET handle in the m_hSocket data member from the CAsyncSocket object and set m_hSocket to NULL.
SOCKET Detach();
CAsyncSocket::FromHandle
Returns a pointer to a CAsyncSocket object.
static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);
Parameters
hSocket
Contains a handle to a socket.
Return Value
A pointer to an CAsyncSocket object, or NULL if there is no CAsyncSocket object attached to hSocket.
Remarks
When given a SOCKET handle, if a CAsyncSocket object is not attached to the handle, the member function returns NULL.
CAsyncSocket::GetLastError
Call this member function to get the error status for the last operation that failed.
static int PASCAL GetLastError();
Return Value
The return value indicates the error code for the last Windows Sockets API routine performed by this thread.
Remarks
When a particular member function indicates that an error has occurred, GetLastError should be called to retrieve the appropriate error code. See the individual member function descriptions for a list of applicable error codes.
For more information about the error codes, see Windows Sockets 2 API.
CAsyncSocket::GetPeerName
Call this member function to get the address of the peer socket to which this socket is connected.
BOOL GetPeerName(
CString& rPeerAddress,
UINT& rPeerPort);
BOOL GetPeerName(
SOCKADDR* lpSockAddr,
int* lpSockAddrLen);
Parameters
rPeerAddress
Reference to a CString object that receives a dotted number IP address.
rPeerPort
Reference to a UINT that stores a port.
lpSockAddr
A pointer to the SOCKADDR structure that receives the name of the peer socket.
lpSockAddrLen
A pointer to the length of the address in lpSockAddr in bytes. On return, the lpSockAddrLen argument contains the actual size of lpSockAddr returned in bytes.
Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEFAULTThelpSockAddrLenargument is not large enough.WSAEINPROGRESSA blocking Windows Sockets call is in progress.WSAENOTCONNThe socket is not connected.WSAENOTSOCKThe descriptor is not a socket.
Remarks
To handle IPv6 addresses, use CAsyncSocket::GetPeerNameEx.
CAsyncSocket::GetPeerNameEx
Call this member function to get the address of the peer socket to which this socket is connected (handles IPv6 addresses).
BOOL GetPeerNameEx(
CString& rPeerAddress,
UINT& rPeerPort);
Parameters
rPeerAddress
Reference to a CString object that receives a dotted number IP address.
rPeerPort
Reference to a UINT that stores a port.
Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEFAULTThelpSockAddrLenargument is not large enough.WSAEINPROGRESSA blocking Windows Sockets call is in progress.WSAENOTCONNThe socket is not connected.WSAENOTSOCKThe descriptor is not a socket.
Remarks
This function is the same as CAsyncSocket::GetPeerName except that it handles IPv6 addresses as well as older protocols.
CAsyncSocket::GetSockName
Call this member function to get the local name for a socket.
BOOL GetSockName(
CString& rSocketAddress,
UINT& rSocketPort);
BOOL GetSockName(
SOCKADDR* lpSockAddr,
int* lpSockAddrLen);
Parameters
rSocketAddress
Reference to a CString object that receives a dotted number IP address.
rSocketPort
Reference to a UINT that stores a port.
lpSockAddr
A pointer to a SOCKADDR structure that receives the address of the socket.
lpSockAddrLen
A pointer to the length of the address in lpSockAddr in bytes.
Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEFAULTThelpSockAddrLenargument is not large enough.WSAEINPROGRESSA blocking Windows Sockets operation is in progress.WSAENOTSOCKThe descriptor is not a socket.WSAEINVALThe socket has not been bound to an address withBind.
Remarks
This call is especially useful when a Connect call has been made without doing a Bind first; this call provides the only means by which you can determine the local association which has been set by the system.
To handle IPv6 addresses, use CAsyncSocket::GetSockNameEx
CAsyncSocket::GetSockNameEx
Call this member function to get the local name for a socket (handles IPv6 addresses).
BOOL GetSockNameEx(
CString& rSocketAddress,
UINT& rSocketPort);
Parameters
rSocketAddress
Reference to a CString object that receives a dotted number IP address.
rSocketPort
Reference to a UINT that stores a port.
Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEFAULTThelpSockAddrLenargument is not large enough.WSAEINPROGRESSA blocking Windows Sockets operation is in progress.WSAENOTSOCKThe descriptor is not a socket.WSAEINVALThe socket has not been bound to an address withBind.
Remarks
This call is the same as CAsyncSocket::GetSockName except that it handles IPv6 addresses as well as older protocols.
This call is especially useful when a Connect call has been made without doing a Bind first; this call provides the only means by which you can determine the local association which has been set by the system.
CAsyncSocket::GetSockOpt
Call this member function to retrieve a socket option.
BOOL GetSockOpt(
int nOptionName,
void* lpOptionValue,
int* lpOptionLen,
int nLevel = SOL_SOCKET);
Parameters
nOptionName
The socket option for which the value is to be retrieved.
lpOptionValue
A pointer to the buffer in which the value for the requested option is to be returned. The value associated with the selected option is returned in the buffer lpOptionValue. The integer pointed to by lpOptionLen should originally contain the size of this buffer in bytes; and on return, it will be set to the size of the value returned. For SO_LINGER, this will be the size of a LINGER structure; for all other options it will be the size of a BOOL or an int, depending on the option. See the list of options and their sizes in the Remarks section.
lpOptionLen
A pointer to the size of the lpOptionValue buffer in bytes.
nLevel
The level at which the option is defined; the only supported levels are SOL_SOCKET and IPPROTO_TCP.
Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError. If an option was never set with SetSockOpt, then GetSockOpt returns the default value for the option. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEFAULTThelpOptionLenargument was invalid.WSAEINPROGRESSA blocking Windows Sockets operation is in progress.WSAENOPROTOOPTThe option is unknown or unsupported. In particular,SO_BROADCASTis not supported on sockets of typeSOCK_STREAM, whileSO_ACCEPTCONN,SO_DONTLINGER,SO_KEEPALIVE,SO_LINGER, andSO_OOBINLINEare not supported on sockets of typeSOCK_DGRAM.WSAENOTSOCKThe descriptor is not a socket.
Remarks
GetSockOpt retrieves the current value for a socket option associated with a socket of any type, in any state, and stores the result in lpOptionValue. Options affect socket operations, such as the routing of packets, out-of-band data transfer, and so on.
The following options are supported for GetSockOpt. The Type identifies the type of data addressed by lpOptionValue. The TCP_NODELAY option uses level IPPROTO_TCP; all other options use level SOL_SOCKET.
| Value | Type | Meaning |
|---|---|---|
SO_ACCEPTCONN |
BOOL |
Socket is listening. |
SO_BROADCAST |
BOOL |
Socket is configured for the transmission of broadcast messages. |
SO_DEBUG |
BOOL |
Debugging is enabled. |
SO_DONTLINGER |
BOOL |
If true, the SO_LINGER option is disabled. |
SO_DONTROUTE |
BOOL |
Routing is disabled. |
SO_ERROR |
int |
Retrieve error status and clear. |
SO_KEEPALIVE |
BOOL |
Keep-alives are being sent. |
SO_LINGER |
struct LINGER |
Returns the current linger options. |
SO_OOBINLINE |
BOOL |
Out-of-band data is being received in the normal data stream. |
SO_RCVBUF |
int |
Buffer size for receives. |
SO_REUSEADDR |
BOOL |
The socket can be bound to an address which is already in use. |
SO_SNDBUF |
int |
Buffer size for sends. |
SO_TYPE |
int |
The type of the socket (for example, SOCK_STREAM). |
TCP_NODELAY |
BOOL |
Disables the Nagle algorithm for send coalescing. |
Berkeley Software Distribution (BSD) options not supported for GetSockOpt are:
| Value | Type | Meaning |
|---|---|---|
SO_RCVLOWAT |
int |
Receive low water mark. |
SO_RCVTIMEO |
int |
Receive timeout. |
SO_SNDLOWAT |
int |
Send low water mark. |
SO_SNDTIMEO |
int |
Send timeout. |
IP_OPTIONS |
Get options in IP header. | |
TCP_MAXSEG |
int |
Get TCP maximum segment size. |
Calling GetSockOpt with an unsupported option will result in an error code of WSAENOPROTOOPT being returned from GetLastError.
CAsyncSocket::IOCtl
Call this member function to control the mode of a socket.
BOOL IOCtl(
long lCommand,
DWORD* lpArgument);
Parameters
lCommand
The command to perform on the socket.
lpArgument
A pointer to a parameter for lCommand.
Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEINVALlCommandis not a valid command, orlpArgumentis not an acceptable parameter forlCommand, or the command is not applicable to the type of socket supplied.WSAEINPROGRESSA blocking Windows Sockets operation is in progress.WSAENOTSOCKThe descriptor is not a socket.
Remarks
This routine can be used on any socket in any state. It is used to get or retrieve operating parameters associated with the socket, independent of the protocol and communications subsystem. The following commands are supported:
FIONBIOEnable or disable nonblocking mode on the socket. ThelpArgumentparameter points at aDWORD, which is nonzero if nonblocking mode is to be enabled and zero if it is to be disabled. IfAsyncSelecthas been issued on a socket, then any attempt to useIOCtlto set the socket back to blocking mode will fail withWSAEINVAL. To set the socket back to blocking mode and prevent theWSAEINVALerror, an application must first disableAsyncSelectby callingAsyncSelectwith thelEventparameter equal to 0, then callIOCtl.FIONREADDetermine the maximum number of bytes that can be read with oneReceivecall from this socket. ThelpArgumentparameter points at aDWORDin whichIOCtlstores the result. If this socket is of typeSOCK_STREAM,FIONREADreturns the total amount of data which can be read in a singleReceive; this is normally the same as the total amount of data queued on the socket. If this socket is of typeSOCK_DGRAM,FIONREADreturns the size of the first datagram queued on the socket.SIOCATMARKDetermine whether all out-of-band data has been read. This applies only to a socket of typeSOCK_STREAMwhich has been configured for in-line reception of any out-of-band data (SO_OOBINLINE). If no out-of-band data is waiting to be read, the operation returns nonzero. Otherwise it returns 0, and the nextReceiveorReceiveFromperformed on the socket will retrieve some or all of the data preceding the "mark"; the application should use theSIOCATMARKoperation to determine whether any data remains. If there is any normal data preceding the "urgent" (out-of-band) data, it will be received in order. (Note that aReceiveorReceiveFromwill never mix out-of-band and normal data in the same call.) ThelpArgumentparameter points at aDWORDin whichIOCtlstores the result.
This function is a subset of ioctl() as used in Berkeley sockets. In particular, there is no command which is equivalent to FIOASYNC, while SIOCATMARK is the only socket-level command which is supported.
CAsyncSocket::Listen
Call this member function to listen for incoming connection requests.
BOOL Listen(int nConnectionBacklog = 5);
Parameters
nConnectionBacklog
The maximum length to which the queue of pending connections can grow. Valid range is from 1 to 5.
Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEADDRINUSEAn attempt has been made to listen on an address in use.WSAEINPROGRESSA blocking Windows Sockets operation is in progress.WSAEINVALThe socket has not been bound withBindor is already connected.WSAEISCONNThe socket is already connected.WSAEMFILENo more file descriptors are available.WSAENOBUFSNo buffer space is available.WSAENOTSOCKThe descriptor is not a socket.WSAEOPNOTSUPPThe referenced socket is not of a type that supports theListenoperation.
Remarks
To accept connections, the socket is first created with Create, a backlog for incoming connections is specified with Listen, and then the connections are accepted with Accept. Listen applies only to sockets that support connections, that is, those of type SOCK_STREAM. This socket is put into "passive" mode where incoming connections are acknowledged and queued pending acceptance by the process.
This function is typically used by servers (or any application that wants to accept connections) that could have more than one connection request at a time: if a connection request arrives with the queue full, the client will receive an error with an indication of WSAECONNREFUSED.
Listen attempts to continue to function rationally when there are no available ports (descriptors). It will accept connections until the queue is emptied. If ports become available, a later call to Listen or Accept will refill the queue to the current or most recent "backlog," if possible, and resume listening for incoming connections.
CAsyncSocket::m_hSocket
Contains the SOCKET handle for the socket encapsulated by this CAsyncSocket object.
SOCKET m_hSocket;
CAsyncSocket::OnAccept
Called by the framework to notify a listening socket that it can accept pending connection requests by calling the Accept member function.
virtual void OnAccept(int nErrorCode);
Parameters
nErrorCode
The most recent error on a socket. The following error codes applies to the OnAccept member function:
0 The function executed successfully.
WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.
Remarks
For more information, see Windows Sockets: Socket Notifications.
CAsyncSocket::OnClose
Called by the framework to notify this socket that the connected socket is closed by its process.
virtual void OnClose(int nErrorCode);
Parameters
nErrorCode
The most recent error on a socket. The following error codes apply to the OnClose member function:
0 The function executed successfully.
WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAECONNRESETThe connection was reset by the remote side.WSAECONNABORTEDThe connection was aborted due to timeout or other failure.
Remarks
For more information, see Windows Sockets: Socket Notifications.
CAsyncSocket::OnConnect
Called by the framework to notify this connecting socket that its connection attempt is completed, whether successfully or in error.
virtual void OnConnect(int nErrorCode);
Parameters
nErrorCode
The most recent error on a socket. The following error codes apply to the OnConnect member function:
0 The function executed successfully.
WSAEADDRINUSEThe specified address is already in use.WSAEADDRNOTAVAILThe specified address is not available from the local machine.WSAEAFNOSUPPORTAddresses in the specified family cannot be used with this socket.WSAECONNREFUSEDThe attempt to connect was forcefully rejected.WSAEDESTADDRREQA destination address is required.WSAEFAULTThelpSockAddrLenargument is incorrect.WSAEINVALThe socket is already bound to an address.WSAEISCONNThe socket is already connected.WSAEMFILENo more file descriptors are available.WSAENETUNREACHThe network cannot be reached from this host at this time.WSAENOBUFSNo buffer space is available. The socket cannot be connected.WSAENOTCONNThe socket is not connected.WSAENOTSOCKThe descriptor is a file, not a socket.WSAETIMEDOUTThe attempt to connect timed out without establishing a connection.
Remarks
Note
In CSocket, the OnConnect notification function is never called. For connections, you simply call Connect, which will return when the connection is completed (either successfully or in error). How connection notifications are handled is an MFC implementation detail.
For more information, see Windows Sockets: Socket Notifications.
Example
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
Called by the framework to notify the receiving socket that the sending socket has out-of-band data to send.
virtual void OnOutOfBandData(int nErrorCode);
Parameters
nErrorCode
The most recent error on a socket. The following error codes apply to the OnOutOfBandData member function:
0 The function executed successfully.
WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.
Remarks
Out-of-band data is a logically independent channel that is associated with each pair of connected sockets of type SOCK_STREAM. The channel is generally used to send urgent data.
MFC supports out-of-band data, but users of class CAsyncSocket are discouraged from using it. The easier way is to create a second socket for passing such data. For more information about out-of-band data, see Windows Sockets: Socket Notifications.
CAsyncSocket::OnReceive
Called by the framework to notify this socket that there is data in the buffer that can be retrieved by calling the Receive member function.
virtual void OnReceive(int nErrorCode);
Parameters
nErrorCode
The most recent error on a socket. The following error codes apply to the OnReceive member function:
0 The function executed successfully.
WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.
Remarks
For more information, see Windows Sockets: Socket Notifications.
Example
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
Called by the framework to notify the socket that it can now send data by calling the Send member function.
virtual void OnSend(int nErrorCode);
Parameters
nErrorCode
The most recent error on a socket. The following error codes apply to the OnSend member function:
0 The function executed successfully.
WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.
Remarks
For more information, see Windows Sockets: Socket Notifications.
Example
// 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 =
Assigns a new value to a CAsyncSocket object.
void operator=(const CAsyncSocket& rSrc);
Parameters
rSrc
A reference to an existing CAsyncSocket object.
Remarks
Call this function to copy an existing CAsyncSocket object to another CAsyncSocket object.
CAsyncSocket::operator SOCKET
Use this operator to retrieve the SOCKET handle of the CAsyncSocket object.
operator SOCKET() const;
Return Value
If successful, the handle of the SOCKET object; otherwise, NULL.
Remarks
You can use the handle to call Windows APIs directly.
CAsyncSocket::Receive
Call this member function to receive data from a socket.
virtual int Receive(
void* lpBuf,
int nBufLen,
int nFlags = 0);
Parameters
lpBuf
A buffer for the incoming data.
nBufLen
The length of lpBuf in bytes.
nFlags
Specifies the way in which the call is made. The semantics of this function are determined by the socket options and the nFlags parameter. The latter is constructed by combining any of the following values with the C++ bitwise OR operator (|):
MSG_PEEKPeek at the incoming data. The data is copied into the buffer but is not removed from the input queue.MSG_OOBProcess out-of-band data.
Return Value
If no error occurs, Receive returns the number of bytes received. If the connection has been closed, it returns 0. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAENOTCONNThe socket is not connected.WSAEINPROGRESSA blocking Windows Sockets operation is in progress.WSAENOTSOCKThe descriptor is not a socket.WSAEOPNOTSUPPMSG_OOBwas specified, but the socket is not of typeSOCK_STREAM.WSAESHUTDOWNThe socket has been shut down; it is not possible to callReceiveon a socket afterShutDownhas been invoked withnHowset to 0 or 2.WSAEWOULDBLOCKThe socket is marked as nonblocking and theReceiveoperation would block.WSAEMSGSIZEThe datagram was too large to fit into the specified buffer and was truncated.WSAEINVALThe socket has not been bound withBind.WSAECONNABORTEDThe virtual circuit was aborted due to timeout or other failure.WSAECONNRESETThe virtual circuit was reset by the remote side.
Remarks
This function is used for connected stream or datagram sockets and is used to read incoming data.
For sockets of type SOCK_STREAM, as much information as is currently available up to the size of the buffer supplied is returned. If the socket has been configured for in-line reception of out-of-band data (socket option SO_OOBINLINE) and out-of-band data is unread, only out-of-band data will be returned. The application can use the IOCtlSIOCATMARK option or OnOutOfBandData to determine whether any more out-of-band data remains to be read.
For datagram sockets, data is extracted from the first enqueued datagram, up to the size of the buffer supplied. If the datagram is larger than the buffer supplied, the buffer is filled with the first part of the datagram, the excess data is lost, and Receive returns a value of SOCKET_ERROR with the error code set to WSAEMSGSIZE. If no incoming data is available at the socket, a value of SOCKET_ERROR is returned with the error code set to WSAEWOULDBLOCK. The OnReceive callback function can be used to determine when more data arrives.
If the socket is of type SOCK_STREAM and the remote side has shut down the connection gracefully, a Receive will complete immediately with 0 bytes received. If the connection has been reset, a Receive will fail with the error WSAECONNRESET.
Receive should be called only once for each time CAsyncSocket::OnReceive is called.
Example
See the example for CAsyncSocket::OnReceive.
CAsyncSocket::ReceiveFrom
Call this member function to receive a datagram and store the source address in the SOCKADDR structure or in 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);
Parameters
lpBuf
A buffer for the incoming data.
nBufLen
The length of lpBuf in bytes.
rSocketAddress
Reference to a CString object that receives a dotted number IP address.
rSocketPort
Reference to a UINT that stores a port.
lpSockAddr
A pointer to a SOCKADDR structure that holds the source address upon return.
lpSockAddrLen
A pointer to the length of the source address in lpSockAddr in bytes.
nFlags
Specifies the way in which the call is made. The semantics of this function are determined by the socket options and the nFlags parameter. The latter is constructed by combining any of the following values with the C++ bitwise OR operator (|):
MSG_PEEKPeek at the incoming data. The data is copied into the buffer but is not removed from the input queue.MSG_OOBProcess out-of-band data.
Return Value
If no error occurs, ReceiveFrom returns the number of bytes received. If the connection has been closed, it returns 0. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEFAULTThelpSockAddrLenargument was invalid: thelpSockAddrbuffer was too small to accommodate the peer address.WSAEINPROGRESSA blocking Windows Sockets operation is in progress.WSAEINVALThe socket has not been bound withBind.WSAENOTCONNThe socket is not connected (SOCK_STREAMonly).WSAENOTSOCKThe descriptor is not a socket.WSAEOPNOTSUPPMSG_OOBwas specified, but the socket is not of typeSOCK_STREAM.WSAESHUTDOWNThe socket has been shut down; it is not possible to callReceiveFromon a socket afterShutDownhas been invoked withnHowset to 0 or 2.WSAEWOULDBLOCKThe socket is marked as nonblocking and theReceiveFromoperation would block.WSAEMSGSIZEThe datagram was too large to fit into the specified buffer and was truncated.WSAECONNABORTEDThe virtual circuit was aborted due to timeout or other failure.WSAECONNRESETThe virtual circuit was reset by the remote side.
Remarks
This function is used to read incoming data on a (possibly connected) socket and capture the address from which the data was sent.
To handle IPv6 addresses, use CAsyncSocket::ReceiveFromEx.
For sockets of type SOCK_STREAM, as much information as is currently available up to the size of the buffer supplied is returned. If the socket has been configured for in-line reception of out-of-band data (socket option SO_OOBINLINE) and out-of-band data is unread, only out-of-band data will be returned. The application can use the IOCtlSIOCATMARK option or OnOutOfBandData to determine whether any more out-of-band data remains to be read. The lpSockAddr and lpSockAddrLen parameters are ignored for SOCK_STREAM sockets.
For datagram sockets, data is extracted from the first enqueued datagram, up to the size of the buffer supplied. If the datagram is larger than the buffer supplied, the buffer is filled with the first part of the message, the excess data is lost, and ReceiveFrom returns a value of SOCKET_ERROR with the error code set to WSAEMSGSIZE.
If lpSockAddr is nonzero, and the socket is of type SOCK_DGRAM, the network address of the socket which sent the data is copied to the corresponding SOCKADDR structure. The value pointed to by lpSockAddrLen is initialized to the size of this structure, and is modified on return to indicate the actual size of the address stored there. If no incoming data is available at the socket, the ReceiveFrom call waits for data to arrive unless the socket is nonblocking. In this case, a value of SOCKET_ERROR is returned with the error code set to WSAEWOULDBLOCK. The OnReceive callback can be used to determine when more data arrives.
If the socket is of type SOCK_STREAM and the remote side has shut down the connection gracefully, a ReceiveFrom will complete immediately with 0 bytes received.
CAsyncSocket::ReceiveFromEx
Call this member function to receive a datagram and store the source address in the SOCKADDR structure or in rSocketAddress (handles IPv6 addresses).
int ReceiveFromEx(
void* lpBuf,
int nBufLen,
CString& rSocketAddress,
UINT& rSocketPort,
int nFlags = 0);
Parameters
lpBuf
A buffer for the incoming data.
nBufLen
The length of lpBuf in bytes.
rSocketAddress
Reference to a CString object that receives a dotted number IP address.
rSocketPort
Reference to a UINT that stores a port.
nFlags
Specifies the way in which the call is made. The semantics of this function are determined by the socket options and the nFlags parameter. The latter is constructed by combining any of the following values with the C++ bitwise OR operator (|):
MSG_PEEKPeek at the incoming data. The data is copied into the buffer but is not removed from the input queue.MSG_OOBProcess out-of-band data.
Return Value
If no error occurs, ReceiveFromEx returns the number of bytes received. If the connection has been closed, it returns 0. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEFAULTThelpSockAddrLenargument was invalid: thelpSockAddrbuffer was too small to accommodate the peer address.WSAEINPROGRESSA blocking Windows Sockets operation is in progress.WSAEINVALThe socket has not been bound withBind.WSAENOTCONNThe socket is not connected (SOCK_STREAMonly).WSAENOTSOCKThe descriptor is not a socket.WSAEOPNOTSUPPMSG_OOBwas specified, but the socket is not of typeSOCK_STREAM.WSAESHUTDOWNThe socket has been shut down; it is not possible to callReceiveFromExon a socket afterShutDownhas been invoked withnHowset to 0 or 2.WSAEWOULDBLOCKThe socket is marked as nonblocking and theReceiveFromExoperation would block.WSAEMSGSIZEThe datagram was too large to fit into the specified buffer and was truncated.WSAECONNABORTEDThe virtual circuit was aborted due to timeout or other failure.WSAECONNRESETThe virtual circuit was reset by the remote side.
Remarks
This function is used to read incoming data on a (possibly connected) socket and capture the address from which the data was sent.
This function is the same as CAsyncSocket::ReceiveFrom except that it handles IPv6 addresses as well as older protocols.
For sockets of type SOCK_STREAM, as much information as is currently available up to the size of the buffer supplied is returned. If the socket has been configured for in-line reception of out-of-band data (socket option SO_OOBINLINE) and out-of-band data is unread, only out-of-band data will be returned. The application can use the IOCtlSIOCATMARK option or OnOutOfBandData to determine whether any more out-of-band data remains to be read. The lpSockAddr and lpSockAddrLen parameters are ignored for SOCK_STREAM sockets.
For datagram sockets, data is extracted from the first enqueued datagram, up to the size of the buffer supplied. If the datagram is larger than the buffer supplied, the buffer is filled with the first part of the message, the excess data is lost, and ReceiveFromEx returns a value of SOCKET_ERROR with the error code set to WSAEMSGSIZE.
If lpSockAddr is nonzero, and the socket is of type SOCK_DGRAM, the network address of the socket which sent the data is copied to the corresponding SOCKADDR structure. The value pointed to by lpSockAddrLen is initialized to the size of this structure, and is modified on return to indicate the actual size of the address stored there. If no incoming data is available at the socket, the ReceiveFromEx call waits for data to arrive unless the socket is nonblocking. In this case, a value of SOCKET_ERROR is returned with the error code set to WSAEWOULDBLOCK. The OnReceive callback can be used to determine when more data arrives.
If the socket is of type SOCK_STREAM and the remote side has shut down the connection gracefully, a ReceiveFromEx will complete immediately with 0 bytes received.
CAsyncSocket::Send
Call this member function to send data on a connected socket.
virtual int Send(
const void* lpBuf,
int nBufLen,
int nFlags = 0);
Parameters
lpBuf
A buffer containing the data to be transmitted.
nBufLen
The length of the data in lpBuf in bytes.
nFlags
Specifies the way in which the call is made. The semantics of this function are determined by the socket options and the nFlags parameter. The latter is constructed by combining any of the following values with the C++ bitwise OR operator (|):
MSG_DONTROUTESpecifies that the data should not be subject to routing. A Windows Sockets supplier can choose to ignore this flag.MSG_OOBSend out-of-band data (SOCK_STREAMonly).
Return Value
If no error occurs, Send returns the total number of characters sent. (Note that this can be less than the number indicated by nBufLen.) Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEACCESThe requested address is a broadcast address, but the appropriate flag was not set.WSAEINPROGRESSA blocking Windows Sockets operation is in progress.WSAEFAULTThelpBufargument is not in a valid part of the user address space.WSAENETRESETThe connection must be reset because the Windows Sockets implementation dropped it.WSAENOBUFSThe Windows Sockets implementation reports a buffer deadlock.WSAENOTCONNThe socket is not connected.WSAENOTSOCKThe descriptor is not a socket.WSAEOPNOTSUPPMSG_OOBwas specified, but the socket is not of typeSOCK_STREAM.WSAESHUTDOWNThe socket has been shut down; it is not possible to callSendon a socket afterShutDownhas been invoked withnHowset to 1 or 2.WSAEWOULDBLOCKThe socket is marked as nonblocking and the requested operation would block.WSAEMSGSIZEThe socket is of typeSOCK_DGRAM, and the datagram is larger than the maximum supported by the Windows Sockets implementation.WSAEINVALThe socket has not been bound withBind.WSAECONNABORTEDThe virtual circuit was aborted due to timeout or other failure.WSAECONNRESETThe virtual circuit was reset by the remote side.
Remarks
Send is used to write outgoing data on connected stream or datagram sockets. For datagram sockets, care must be taken not to exceed the maximum IP packet size of the underlying subnets, which is given by the iMaxUdpDg element in the WSADATA structure returned by AfxSocketInit. If the data is too long to pass atomically through the underlying protocol, the error WSAEMSGSIZE is returned via GetLastError, and no data is transmitted.
Note that for a datagram socket the successful completion of a Send does not indicate that the data was successfully delivered.
On CAsyncSocket objects of type SOCK_STREAM, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both the local and foreign hosts.
Example
See the example for CAsyncSocket::OnSend.
CAsyncSocket::SendTo
Call this member function to send data to a specific destination.
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);
Parameters
lpBuf
A buffer containing the data to be transmitted.
nBufLen
The length of the data in lpBuf in bytes.
nHostPort
The port identifying the socket application.
lpszHostAddress
The network address of the socket to which this object is connected: a machine name such as "ftp.microsoft.com," or a dotted number such as "128.56.22.8".
nFlags
Specifies the way in which the call is made. The semantics of this function are determined by the socket options and the nFlags parameter. The latter is constructed by combining any of the following values with the C++ bitwise OR operator (|):
MSG_DONTROUTESpecifies that the data should not be subject to routing. A Windows Sockets supplier can choose to ignore this flag.MSG_OOBSend out-of-band data (SOCK_STREAMonly).
lpSockAddr
A pointer to a SOCKADDR structure that contains the address of the target socket.
nSockAddrLen
The length of the address in lpSockAddr in bytes.
Return Value
If no error occurs, SendTo returns the total number of characters sent. (Note that this can be less than the number indicated by nBufLen.) Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEACCESThe requested address is a broadcast address, but the appropriate flag was not set.WSAEINPROGRESSA blocking Windows Sockets operation is in progress.WSAEFAULTThelpBuforlpSockAddrparameters are not part of the user address space, or thelpSockAddrargument is too small (less than the size of aSOCKADDRstructure).WSAEINVALThe host name is invalid.WSAENETRESETThe connection must be reset because the Windows Sockets implementation dropped it.WSAENOBUFSThe Windows Sockets implementation reports a buffer deadlock.WSAENOTCONNThe socket is not connected (SOCK_STREAMonly).WSAENOTSOCKThe descriptor is not a socket.WSAEOPNOTSUPPMSG_OOBwas specified, but the socket is not of typeSOCK_STREAM.WSAESHUTDOWNThe socket has been shut down; it is not possible to callSendToon a socket afterShutDownhas been invoked withnHowset to 1 or 2.WSAEWOULDBLOCKThe socket is marked as nonblocking and the requested operation would block.WSAEMSGSIZEThe socket is of typeSOCK_DGRAM, and the datagram is larger than the maximum supported by the Windows Sockets implementation.WSAECONNABORTEDThe virtual circuit was aborted due to timeout or other failure.WSAECONNRESETThe virtual circuit was reset by the remote side.WSAEADDRNOTAVAILThe specified address is not available from the local machine.WSAEAFNOSUPPORTAddresses in the specified family cannot be used with this socket.WSAEDESTADDRREQA destination address is required.WSAENETUNREACHThe network cannot be reached from this host at this time.
Remarks
SendTo is used on datagram or stream sockets and is used to write outgoing data on a socket. For datagram sockets, care must be taken not to exceed the maximum IP packet size of the underlying subnets, which is given by the iMaxUdpDg element in the WSADATA structure filled out by AfxSocketInit. If the data is too long to pass atomically through the underlying protocol, the error WSAEMSGSIZE is returned, and no data is transmitted.
Note that the successful completion of a SendTo does not indicate that the data was successfully delivered.
SendTo is only used on a SOCK_DGRAM socket to send a datagram to a specific socket identified by the lpSockAddr parameter.
To send a broadcast (on a SOCK_DGRAM only), the address in the lpSockAddr parameter should be constructed using the special IP address INADDR_BROADCAST (defined in the Windows Sockets header file WINSOCK.H) together with the intended port number. Or, if the lpszHostAddress parameter is NULL, the socket is configured for broadcast. It is generally inadvisable for a broadcast datagram to exceed the size at which fragmentation can occur, which implies that the data portion of the datagram (excluding headers) should not exceed 512 bytes.
To handle IPv6 addresses, use CAsyncSocket::SendToEx.
CAsyncSocket::SendToEx
Call this member function to send data to a specific destination (handles IPv6 addresses).
int SendToEx(
const void* lpBuf,
int nBufLen,
UINT nHostPort,
LPCTSTR lpszHostAddress = NULL,
int nFlags = 0);
Parameters
lpBuf
A buffer containing the data to be transmitted.
nBufLen
The length of the data in lpBuf in bytes.
nHostPort
The port identifying the socket application.
lpszHostAddress
The network address of the socket to which this object is connected: a machine name such as "ftp.microsoft.com," or a dotted number such as "128.56.22.8".
nFlags
Specifies the way in which the call is made. The semantics of this function are determined by the socket options and the nFlags parameter. The latter is constructed by combining any of the following values with the C++ bitwise OR operator (|):
MSG_DONTROUTESpecifies that the data should not be subject to routing. A Windows Sockets supplier can choose to ignore this flag.MSG_OOBSend out-of-band data (SOCK_STREAMonly).
Return Value
If no error occurs, SendToEx returns the total number of characters sent. (Note that this can be less than the number indicated by nBufLen.) Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEACCESThe requested address is a broadcast address, but the appropriate flag was not set.WSAEINPROGRESSA blocking Windows Sockets operation is in progress.WSAEFAULTThelpBuforlpSockAddrparameters are not part of the user address space, or thelpSockAddrargument is too small (less than the size of aSOCKADDRstructure).WSAEINVALThe host name is invalid.WSAENETRESETThe connection must be reset because the Windows Sockets implementation dropped it.WSAENOBUFSThe Windows Sockets implementation reports a buffer deadlock.WSAENOTCONNThe socket is not connected (SOCK_STREAMonly).WSAENOTSOCKThe descriptor is not a socket.WSAEOPNOTSUPPMSG_OOBwas specified, but the socket is not of typeSOCK_STREAM.WSAESHUTDOWNThe socket has been shut down; it is not possible to callSendToExon a socket afterShutDownhas been invoked withnHowset to 1 or 2.WSAEWOULDBLOCKThe socket is marked as nonblocking and the requested operation would block.WSAEMSGSIZEThe socket is of typeSOCK_DGRAM, and the datagram is larger than the maximum supported by the Windows Sockets implementation.WSAECONNABORTEDThe virtual circuit was aborted due to timeout or other failure.WSAECONNRESETThe virtual circuit was reset by the remote side.WSAEADDRNOTAVAILThe specified address is not available from the local machine.WSAEAFNOSUPPORTAddresses in the specified family cannot be used with this socket.WSAEDESTADDRREQA destination address is required.WSAENETUNREACHThe network cannot be reached from this host at this time.
Remarks
This method is the same as CAsyncSocket::SendTo except that it handles IPv6 addresses as well as older protocols.
SendToEx is used on datagram or stream sockets and is used to write outgoing data on a socket. For datagram sockets, care must be taken not to exceed the maximum IP packet size of the underlying subnets, which is given by the iMaxUdpDg element in the WSADATA structure filled out by AfxSocketInit. If the data is too long to pass atomically through the underlying protocol, the error WSAEMSGSIZE is returned, and no data is transmitted.
Note that the successful completion of a SendToEx does not indicate that the data was successfully delivered.
SendToEx is only used on a SOCK_DGRAM socket to send a datagram to a specific socket identified by the lpSockAddr parameter.
To send a broadcast (on a SOCK_DGRAM only), the address in the lpSockAddr parameter should be constructed using the special IP address INADDR_BROADCAST (defined in the Windows Sockets header file WINSOCK.H) together with the intended port number. Or, if the lpszHostAddress parameter is NULL, the socket is configured for broadcast. It is generally inadvisable for a broadcast datagram to exceed the size at which fragmentation can occur, which implies that the data portion of the datagram (excluding headers) should not exceed 512 bytes.
CAsyncSocket::SetSockOpt
Call this member function to set a socket option.
BOOL SetSockOpt(
int nOptionName,
const void* lpOptionValue,
int nOptionLen,
int nLevel = SOL_SOCKET);
Parameters
nOptionName
The socket option for which the value is to be set.
lpOptionValue
A pointer to the buffer in which the value for the requested option is supplied.
nOptionLen
The size of the lpOptionValue buffer in bytes.
nLevel
The level at which the option is defined; the only supported levels are SOL_SOCKET and IPPROTO_TCP.
Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEFAULTlpOptionValueis not in a valid part of the process address space.WSAEINPROGRESSA blocking Windows Sockets operation is in progress.WSAEINVALnLevelis not valid, or the information inlpOptionValueis not valid.WSAENETRESETConnection has timed out whenSO_KEEPALIVEis set.WSAENOPROTOOPTThe option is unknown or unsupported. In particular,SO_BROADCASTis not supported on sockets of typeSOCK_STREAM, whileSO_DONTLINGER,SO_KEEPALIVE,SO_LINGER, andSO_OOBINLINEare not supported on sockets of typeSOCK_DGRAM.WSAENOTCONNConnection has been reset whenSO_KEEPALIVEis set.WSAENOTSOCKThe descriptor is not a socket.
Remarks
SetSockOpt sets the current value for a socket option associated with a socket of any type, in any state. Although options can exist at multiple protocol levels, this specification only defines options that exist at the uppermost "socket" level. Options affect socket operations, such as whether expedited data is received in the normal data stream, whether broadcast messages can be sent on the socket, and so on.
There are two types of socket options: Boolean options that enable or disable a feature or behavior, and options which require an integer value or structure. To enable a Boolean option, lpOptionValue points to a nonzero integer. To disable the option lpOptionValue points to an integer equal to zero. nOptionLen should be equal to sizeof(BOOL) for Boolean options. For other options, lpOptionValue points to the integer or structure that contains the desired value for the option, and nOptionLen is the length of the integer or structure.
SO_LINGER controls the action taken when unsent data is queued on a socket and the Close function is called to close the socket.
By default, a socket cannot be bound (see Bind) to a local address which is already in use. On occasion, however, it may be desirable to "reuse" an address in this way. Since every connection is uniquely identified by the combination of local and remote addresses, there is no problem with having two sockets bound to the same local address as long as the remote addresses are different.
To inform the Windows Sockets implementation that a Bind call on a socket should not be disallowed because the desired address is already in use by another socket, the application should set the SO_REUSEADDR socket option for the socket before issuing the Bind call. Note that the option is interpreted only at the time of the Bind call: it is therefore unnecessary (but harmless) to set the option on a socket which is not to be bound to an existing address, and setting or resetting the option after the Bind call has no effect on this or any other socket.
An application can request that the Windows Sockets implementation enable the use of "keep-alive" packets on Transmission Control Protocol (TCP) connections by turning on the SO_KEEPALIVE socket option. A Windows Sockets implementation need not support the use of keep-alives: if it does, the precise semantics are implementation-specific but should conform to section 4.2.3.6 of RFC 1122: "Requirements for Internet Hosts — Communication Layers." If a connection is dropped as the result of "keep-alives" the error code WSAENETRESET is returned to any calls in progress on the socket, and any subsequent calls will fail with WSAENOTCONN.
The TCP_NODELAY option disables the Nagle algorithm. The Nagle algorithm is used to reduce the number of small packets sent by a host by buffering unacknowledged send data until a full-size packet can be sent. However, for some applications this algorithm can impede performance, and TCP_NODELAY can be used to turn it off. Application writers should not set TCP_NODELAY unless the impact of doing so is well-understood and desired, since setting TCP_NODELAY can have a significant negative impact on network performance. TCP_NODELAY is the only supported socket option which uses level IPPROTO_TCP; all other options use level SOL_SOCKET.
Some implementations of Windows Sockets supply output debug information if the SO_DEBUG option is set by an application.
The following options are supported for SetSockOpt. The Type identifies the type of data addressed by lpOptionValue.
| Value | Type | Meaning |
|---|---|---|
SO_BROADCAST |
BOOL |
Allow transmission of broadcast messages on the socket. |
SO_DEBUG |
BOOL |
Record debugging information. |
SO_DONTLINGER |
BOOL |
Don't block Close waiting for unsent data to be sent. Setting this option is equivalent to setting SO_LINGER with l_onoff set to zero. |
SO_DONTROUTE |
BOOL |
Don't route: send directly to interface. |
SO_KEEPALIVE |
BOOL |
Send keep-alives. |
SO_LINGER |
struct LINGER |
Linger on Close if unsent data is present. |
SO_OOBINLINE |
BOOL |
Receive out-of-band data in the normal data stream. |
SO_RCVBUF |
int |
Specify buffer size for receives. |
SO_REUSEADDR |
BOOL |
Allow the socket to be bound to an address which is already in use. (See Bind.) |
SO_SNDBUF |
int |
Specify buffer size for sends. |
TCP_NODELAY |
BOOL |
Disables the Nagle algorithm for send coalescing. |
Berkeley Software Distribution (BSD) options not supported for SetSockOpt are:
| Value | Type | Meaning |
|---|---|---|
SO_ACCEPTCONN |
BOOL |
Socket is listening |
SO_ERROR |
int |
Get error status and clear. |
SO_RCVLOWAT |
int |
Receive low water mark. |
SO_RCVTIMEO |
int |
Receive timeout |
SO_SNDLOWAT |
int |
Send low water mark. |
SO_SNDTIMEO |
int |
Send timeout. |
SO_TYPE |
int |
Type of the socket. |
IP_OPTIONS |
Set options field in IP header. |
CAsyncSocket::ShutDown
Call this member function to disable sends, receives, or both on the socket.
BOOL ShutDown(int nHow = sends);
Parameters
nHow
A flag that describes what types of operation will no longer be allowed, using the following enumerated values:
receives = 0
sends = 1
both = 2
Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:
WSANOTINITIALISEDA successfulAfxSocketInitmust occur before using this API.WSAENETDOWNThe Windows Sockets implementation detected that the network subsystem failed.WSAEINVALnHowis not valid.WSAEINPROGRESSA blocking Windows Sockets operation is in progress.WSAENOTCONNThe socket is not connected (SOCK_STREAMonly).WSAENOTSOCKThe descriptor is not a socket.
Remarks
ShutDown is used on all types of sockets to disable reception, transmission, or both. If nHow is 0, subsequent receives on the socket will be disallowed. This has no effect on the lower protocol layers.
For Transmission Control Protocol (TCP), the TCP window is not changed and incoming data will be accepted (but not acknowledged) until the window is exhausted. For User Datagram Protocol (UDP), incoming datagrams are accepted and queued. In no case will an ICMP error packet be generated. If nHow is 1, subsequent sends are disallowed. For TCP sockets, a FIN will be sent. Setting nHow to 2 disables both sends and receives as described above.
Note that ShutDown does not close the socket, and resources attached to the socket will not be freed until Close is called. An application should not rely on being able to reuse a socket after it has been shut down. In particular, a Windows Sockets implementation is not required to support the use of Connect on such a socket.
Example
See the example for CAsyncSocket::OnReceive.
CASyncSocket::Socket
Allocates a socket handle.
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);
Parameters
nSocketType
Specifies SOCK_STREAM or SOCK_DGRAM.
lEvent
A bitmask that specifies a combination of network events in which the application is interested.
FD_READ: Want to receive notification of readiness for reading.FD_WRITE: Want to receive notification of readiness for writing.FD_OOB: Want to receive notification of the arrival of out-of-band data.FD_ACCEPT: Want to receive notification of incoming connections.FD_CONNECT: Want to receive notification of completed connection.FD_CLOSE: Want to receive notification of socket closure.
nProtocolType
Protocol to be used with the socket that is specific to the indicated address family.
nAddressFormat
Address family specification.
Return Value
Returns TRUE on success, FALSE on failure.
Remarks
This method allocates a socket handle. It does not call CAsyncSocket::Bind to bind the socket to a specified address, so you need to call Bind later to bind the socket to a specified address. You can use CAsyncSocket::SetSockOpt to set the socket option before it is bound.
See also
CObject Class
Hierarchy Chart
CSocket Class
CSocketFile Class