CAsyncSocket Class
The new home for Visual Studio documentation is Visual Studio 2017 Documentation on docs.microsoft.com.
The latest version of this topic can be found at CAsyncSocket Class.
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::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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEFAULT The
lpSockAddrLen
argument is too small (less than the size of a SOCKADDR structure).WSAEINPROGRESS A blocking Windows Sockets call is in progress.
WSAEINVAL
Listen
was not invoked prior to accept.WSAEMFILE The queue is empty upon entry to accept and there are no descriptors available.
WSAENOBUFS
No buffer space is available.WSAENOTSOCK The descriptor is not a socket.
WSAEOPNOTSUPP The referenced socket is not a type that supports connection-oriented service.
WSAEWOULDBLOCK The 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_READ Want to receive notification of readiness for reading.
FD_WRITE Want to receive notification when data is available to be read.
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 connection results.
FD_CLOSE Want 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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEINVAL Indicates that one of the specified parameters was invalid.
WSAEINPROGRESS A 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_READ Want to receive notification of readiness for reading.
FD_WRITE Want to receive notification when data is available to be read.
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 connection results.
FD_CLOSE Want 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 errors apply to this member function:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEADDRINUSE The specified address is already in use. (See the SO_REUSEADDR socket option under SetSockOpt.)
WSAEFAULT The
nSockAddrLen
argument is too small (less than the size of a SOCKADDR structure).WSAEINPROGRESS A blocking Windows Sockets call is in progress.
WSAEAFNOSUPPORT The specified address family is not supported by this port.
WSAEINVAL The socket is already bound to an address.
WSAENOBUFS
Not enough buffers available, too many connections.WSAENOTSOCK The 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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEADDRINUSE The specified address is already in use.
WSAEINPROGRESS A blocking Windows Sockets call is in progress.
WSAEADDRNOTAVAIL The specified address is not available from the local machine.
WSAEAFNOSUPPORT Addresses in the specified family cannot be used with this socket.
WSAECONNREFUSED The attempt to connect was rejected.
WSAEDESTADDRREQ A destination address is required.
WSAEFAULT The
nSockAddrLen
argument is incorrect.WSAEINVAL Invalid host address.
WSAEISCONN The socket is already connected.
WSAEMFILE No more file descriptors are available.
WSAENETUNREACH The network cannot be reached from this host at this time.
WSAENOBUFS
No buffer space is available. The socket cannot be connected.WSAENOTSOCK The descriptor is not a socket.
WSAETIMEDOUT Attempt to connect timed out without establishing a connection.
WSAEWOULDBLOCK The 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_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.
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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEAFNOSUPPORT The specified address family is not supported.
WSAEINPROGRESS A blocking Windows Sockets operation is in progress.
WSAEMFILE No more file descriptors are available.
WSAENOBUFS
No buffer space is available. The socket cannot be created.WSAEPROTONOSUPPORT The specified port is not supported.
WSAEPROTOTYPE The specified port is the wrong type for this socket.
WSAESOCKTNOSUPPORT The 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_STREAM Provides sequenced, reliable, full-duplex, connection-based byte streams. Uses the Transmission Control Protocol (TCP) for the Internet address family.
SOCK_DGRAM Supports 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 Accept member function takes a reference to a new, empty
CSocket
object as its parameter. You must construct this object before you call Accept. Keep in mind that if this socket object goes out of scope, the connection closes. Do not call Create for 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::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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEFAULT The
lpSockAddrLen
argument is not large enough.WSAEINPROGRESS A blocking Windows Sockets call is in progress.
WSAENOTCONN The socket is not connected.
WSAENOTSOCK The 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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEFAULT The
lpSockAddrLen
argument is not large enough.WSAEINPROGRESS A blocking Windows Sockets call is in progress.
WSAENOTCONN The socket is not connected.
WSAENOTSOCK The 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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEFAULT The
lpSockAddrLen
argument is not large enough.WSAEINPROGRESS A blocking Windows Sockets operation is in progress.
WSAENOTSOCK The descriptor is not a socket.
WSAEINVAL The socket has not been bound to an address with Bind.
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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEFAULT The
lpSockAddrLen
argument is not large enough.WSAEINPROGRESS A blocking Windows Sockets operation is in progress.
WSAENOTSOCK The descriptor is not a socket.
WSAEINVAL The socket has not been bound to an address with Bind.
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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEFAULT The
lpOptionLen
argument was invalid.WSAEINPROGRESS A blocking Windows Sockets operation is in progress.
WSAENOPROTOOPT The option is unknown or unsupported. In particular, SO_BROADCAST is not supported on sockets of type SOCK_STREAM, while SO_ACCEPTCONN, SO_DONTLINGER, SO_KEEPALIVE, SO_LINGER, and SO_OOBINLINE are not supported on sockets of type SOCK_DGRAM.
WSAENOTSOCK The 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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEINVAL
lCommand
is not a valid command, orlpArgument
is not an acceptable parameter forlCommand
, or the command is not applicable to the type of socket supplied.WSAEINPROGRESS A blocking Windows Sockets operation is in progress.
WSAENOTSOCK The 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:
FIONBIO Enable or disable nonblocking mode on the socket. The
lpArgument
parameter points at aDWORD
, which is nonzero if nonblocking mode is to be enabled and zero if it is to be disabled. IfAsyncSelect
has been issued on a socket, then any attempt to use IOCtl to set the socket back to blocking mode will fail with WSAEINVAL. To set the socket back to blocking mode and prevent the WSAEINVAL error, an application must first disableAsyncSelect
by callingAsyncSelect
with thelEvent
parameter equal to 0, then call IOCtl.FIONREAD Determine the maximum number of bytes that can be read with one Receive call from this socket. The
lpArgument
parameter points at aDWORD
in which IOCtl stores the result. If this socket is of type SOCK_STREAM, FIONREAD returns the total amount of data which can be read in a single Receive; this is normally the same as the total amount of data queued on the socket. If this socket is of type SOCK_DGRAM, FIONREAD returns the size of the first datagram queued on the socket.SIOCATMARK Determine whether all out-of-band data has been read. This applies only to a socket of type SOCK_STREAM which 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 next Receive or
ReceiveFrom
performed on the socket will retrieve some or all of the data preceding the "mark"; the application should use the SIOCATMARK operation 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 a Receive orReceiveFrom
will never mix out-of-band and normal data in the same call.) ThelpArgument
parameter points at aDWORD
in which IOCtl stores 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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEADDRINUSE An attempt has been made to listen on an address in use.
WSAEINPROGRESS A blocking Windows Sockets operation is in progress.
WSAEINVAL The socket has not been bound with Bind or is already connected.
WSAEISCONN The socket is already connected.
WSAEMFILE No more file descriptors are available.
WSAENOBUFS
No buffer space is available.WSAENOTSOCK The descriptor is not a socket.
WSAEOPNOTSUPP The referenced socket is not of a type that supports the
Listen
operation.
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.
WSAENETDOWN The 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.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAECONNRESET The connection was reset by the remote side.
WSAECONNABORTED The 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.
WSAEADDRINUSE The specified address is already in use.
WSAEADDRNOTAVAIL The specified address is not available from the local machine.
WSAEAFNOSUPPORT Addresses in the specified family cannot be used with this socket.
WSAECONNREFUSED The attempt to connect was forcefully rejected.
WSAEDESTADDRREQ A destination address is required.
WSAEFAULT The
lpSockAddrLen
argument is incorrect.WSAEINVAL The socket is already bound to an address.
WSAEISCONN The socket is already connected.
WSAEMFILE No more file descriptors are available.
WSAENETUNREACH The network cannot be reached from this host at this time.
WSAENOBUFS
No buffer space is available. The socket cannot be connected.WSAENOTCONN The socket is not connected.
WSAENOTSOCK The descriptor is a file, not a socket.
WSAETIMEDOUT The 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.
WSAENETDOWN The 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.
WSAENETDOWN The 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.
WSAENETDOWN The 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++ OR
operator:
MSG_PEEK Peek at the incoming data. The data is copied into the buffer but is not removed from the input queue.
MSG_OOB Process 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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAENOTCONN The socket is not connected.
WSAEINPROGRESS A blocking Windows Sockets operation is in progress.
WSAENOTSOCK The descriptor is not a socket.
WSAEOPNOTSUPP MSG_OOB was specified, but the socket is not of type SOCK_STREAM.
WSAESHUTDOWN The socket has been shut down; it is not possible to call Receive on a socket after
ShutDown
has been invoked withnHow
set to 0 or 2.WSAEWOULDBLOCK The socket is marked as nonblocking and the Receive operation would block.
WSAEMSGSIZE The datagram was too large to fit into the specified buffer and was truncated.
WSAEINVAL The socket has not been bound with Bind.
WSAECONNABORTED The virtual circuit was aborted due to timeout or other failure.
WSAECONNRESET The 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++ OR
operator:
MSG_PEEK Peek at the incoming data. The data is copied into the buffer but is not removed from the input queue.
MSG_OOB Process 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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEFAULT The
lpSockAddrLen
argument was invalid: thelpSockAddr
buffer was too small to accommodate the peer address.WSAEINPROGRESS A blocking Windows Sockets operation is in progress.
WSAEINVAL The socket has not been bound with Bind.
WSAENOTCONN The socket is not connected ( SOCK_STREAM only).
WSAENOTSOCK The descriptor is not a socket.
WSAEOPNOTSUPP MSG_OOB was specified, but the socket is not of type SOCK_STREAM.
WSAESHUTDOWN The socket has been shut down; it is not possible to call
ReceiveFrom
on a socket afterShutDown
has been invoked withnHow
set to 0 or 2.WSAEWOULDBLOCK The socket is marked as nonblocking and the
ReceiveFrom
operation would block.WSAEMSGSIZE The datagram was too large to fit into the specified buffer and was truncated.
WSAECONNABORTED The virtual circuit was aborted due to timeout or other failure.
WSAECONNRESET The 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++ OR
operator:
MSG_PEEK Peek at the incoming data. The data is copied into the buffer but is not removed from the input queue.
MSG_OOB Process 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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEFAULT The
lpSockAddrLen
argument was invalid: thelpSockAddr
buffer was too small to accommodate the peer address.WSAEINPROGRESS A blocking Windows Sockets operation is in progress.
WSAEINVAL The socket has not been bound with Bind.
WSAENOTCONN The socket is not connected ( SOCK_STREAM only).
WSAENOTSOCK The descriptor is not a socket.
WSAEOPNOTSUPP MSG_OOB was specified, but the socket is not of type SOCK_STREAM.
WSAESHUTDOWN The socket has been shut down; it is not possible to call
ReceiveFromEx
on a socket afterShutDown
has been invoked withnHow
set to 0 or 2.WSAEWOULDBLOCK The socket is marked as nonblocking and the
ReceiveFromEx
operation would block.WSAEMSGSIZE The datagram was too large to fit into the specified buffer and was truncated.
WSAECONNABORTED The virtual circuit was aborted due to timeout or other failure.
WSAECONNRESET The 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++ OR
operator:
MSG_DONTROUTE Specifies that the data should not be subject to routing. A Windows Sockets supplier can choose to ignore this flag.
MSG_OOB Send out-of-band data ( SOCK_STREAM only).
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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEACCES The requested address is a broadcast address, but the appropriate flag was not set.
WSAEINPROGRESS A blocking Windows Sockets operation is in progress.
WSAEFAULT The
lpBuf
argument is not in a valid part of the user address space.WSAENETRESET The connection must be reset because the Windows Sockets implementation dropped it.
WSAENOBUFS
The Windows Sockets implementation reports a buffer deadlock.WSAENOTCONN The socket is not connected.
WSAENOTSOCK The descriptor is not a socket.
WSAEOPNOTSUPP MSG_OOB was specified, but the socket is not of type SOCK_STREAM.
WSAESHUTDOWN The socket has been shut down; it is not possible to call Send on a socket after
ShutDown
has been invoked withnHow
set to 1 or 2.WSAEWOULDBLOCK The socket is marked as nonblocking and the requested operation would block.
WSAEMSGSIZE The socket is of type SOCK_DGRAM, and the datagram is larger than the maximum supported by the Windows Sockets implementation.
WSAEINVAL The socket has not been bound with Bind.
WSAECONNABORTED The virtual circuit was aborted due to timeout or other failure.
WSAECONNRESET The 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++ OR
operator:
MSG_DONTROUTE Specifies that the data should not be subject to routing. A Windows Sockets supplier can choose to ignore this flag.
MSG_OOB Send out-of-band data ( SOCK_STREAM only).
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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEACCES The requested address is a broadcast address, but the appropriate flag was not set.
WSAEINPROGRESS A blocking Windows Sockets operation is in progress.
WSAEFAULT The
lpBuf
orlpSockAddr
parameters are not part of the user address space, or thelpSockAddr
argument is too small (less than the size of a SOCKADDR structure).WSAEINVAL The host name is invalid.
WSAENETRESET The connection must be reset because the Windows Sockets implementation dropped it.
WSAENOBUFS
The Windows Sockets implementation reports a buffer deadlock.WSAENOTCONN The socket is not connected ( SOCK_STREAM only).
WSAENOTSOCK The descriptor is not a socket.
WSAEOPNOTSUPP MSG_OOB was specified, but the socket is not of type SOCK_STREAM.
WSAESHUTDOWN The socket has been shut down; it is not possible to call
SendTo
on a socket afterShutDown
has been invoked withnHow
set to 1 or 2.WSAEWOULDBLOCK The socket is marked as nonblocking and the requested operation would block.
WSAEMSGSIZE The socket is of type SOCK_DGRAM, and the datagram is larger than the maximum supported by the Windows Sockets implementation.
WSAECONNABORTED The virtual circuit was aborted due to timeout or other failure.
WSAECONNRESET The virtual circuit was reset by the remote side.
WSAEADDRNOTAVAIL The specified address is not available from the local machine.
WSAEAFNOSUPPORT Addresses in the specified family cannot be used with this socket.
WSAEDESTADDRREQ A destination address is required.
WSAENETUNREACH The 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++ OR
operator:
MSG_DONTROUTE Specifies that the data should not be subject to routing. A Windows Sockets supplier can choose to ignore this flag.
MSG_OOB Send out-of-band data ( SOCK_STREAM only).
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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEACCES The requested address is a broadcast address, but the appropriate flag was not set.
WSAEINPROGRESS A blocking Windows Sockets operation is in progress.
WSAEFAULT The
lpBuf
orlpSockAddr
parameters are not part of the user address space, or thelpSockAddr
argument is too small (less than the size of a SOCKADDR structure).WSAEINVAL The host name is invalid.
WSAENETRESET The connection must be reset because the Windows Sockets implementation dropped it.
WSAENOBUFS
The Windows Sockets implementation reports a buffer deadlock.WSAENOTCONN The socket is not connected ( SOCK_STREAM only).
WSAENOTSOCK The descriptor is not a socket.
WSAEOPNOTSUPP MSG_OOB was specified, but the socket is not of type SOCK_STREAM.
WSAESHUTDOWN The socket has been shut down; it is not possible to call
SendToEx
on a socket afterShutDown
has been invoked withnHow
set to 1 or 2.WSAEWOULDBLOCK The socket is marked as nonblocking and the requested operation would block.
WSAEMSGSIZE The socket is of type SOCK_DGRAM, and the datagram is larger than the maximum supported by the Windows Sockets implementation.
WSAECONNABORTED The virtual circuit was aborted due to timeout or other failure.
WSAECONNRESET The virtual circuit was reset by the remote side.
WSAEADDRNOTAVAIL The specified address is not available from the local machine.
WSAEAFNOSUPPORT Addresses in the specified family cannot be used with this socket.
WSAEDESTADDRREQ A destination address is required.
WSAENETUNREACH The 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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEFAULT
lpOptionValue
is not in a valid part of the process address space.WSAEINPROGRESS A blocking Windows Sockets operation is in progress.
WSAEINVAL
nLevel
is not valid, or the information inlpOptionValue
is not valid.WSAENETRESET Connection has timed out when SO_KEEPALIVE is set.
WSAENOPROTOOPT The option is unknown or unsupported. In particular, SO_BROADCAST is not supported on sockets of type SOCK_STREAM, while SO_DONTLINGER, SO_KEEPALIVE, SO_LINGER, and SO_OOBINLINE are not supported on sockets of type SOCK_DGRAM.
WSAENOTCONN Connection has been reset when SO_KEEPALIVE is set.
WSAENOTSOCK The 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:
WSANOTINITIALISED A successful AfxSocketInit must occur before using this API.
WSAENETDOWN The Windows Sockets implementation detected that the network subsystem failed.
WSAEINVAL
nHow
is not valid.WSAEINPROGRESS A blocking Windows Sockets operation is in progress.
WSAENOTCONN The socket is not connected ( SOCK_STREAM only).
WSAENOTSOCK The 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