#include <sock.h>
Inheritance diagram for NLNET::CSock:
The "logging" boolean value is necessary because in this implementation we always log to one single global CLog object : there is not one CLog object per socket. Therefore we must prevent the socket used in CNetDisplayer from logging itself... otherwise we would have an infinite recursion.
The "connected" property may have a different meaning whether the socket is a stream socket (e.g. using TCP) or it is a connectionless datagram socket (e.g. using UDP). In the latter, "connected" only means that the local and the remote addresses have been set.
Important note: this class is thread-safe, meaning you can access to a CSock object from multiple threads BUT the only things you are allow to do in parallel are receive/send and read the connected() property.
You must call CSock::initNetwork() before using any network class (even CInetAddress). You must call CSock::releaseNetwork() at the end of your program.
By default, a socket is in blocking mode. Call setNonBlockingMode() to change this behaviour.
Nevrax France
Definition at line 121 of file sock.h.
Socket setup | |
virtual void | close () |
virtual void | connect (const CInetAddress &addr) |
bool | nonBlockingMode () const |
Returns the nonblocking mode. | |
void | setNonBlockingMode (bool bm) |
virtual | ~CSock () |
Destructor (shutdown + close). | |
Receiving data | |
bool | dataAvailable () |
Checks if there is some data to receive, waiting (blocking) at most for the time out value. | |
CSock::TSockResult | receive (uint8 *buffer, uint32 &len, bool throw_exception=true) |
Public Types | |
enum | TSockResult { Ok, WouldBlock, ConnectionClosed, Error } |
Public Member Functions | |
uint64 | bytesReceived () const |
Returns the number of bytes received since the latest connection. | |
uint64 | bytesSent () const |
Returns the number of bytes sent since the latest connection. | |
sint32 | getSendBufferSize () |
Gets the send buffer size. | |
void | setSendBufferSize (sint32 size) |
Sets the send buffer size. | |
void | setTimeOutValue (long sec, long ms) |
Change the time out value used in getDataAvailable(), which is 0 by default. | |
Static Public Member Functions | |
std::string | errorString (uint errorcode) |
Returns a string explaining the network error (see getLastError()). | |
uint | getLastError () |
bool | initialized () |
Returns true if the network engine is initialized. | |
void | initNetwork () |
Initialize the network engine, if it is not already done. | |
void | releaseNetwork () |
Releases the network engine. | |
Protected Member Functions | |
void | createSocket (int type, int protocol) |
Creates the socket and get a valid descriptor. | |
CSock (SOCKET sock, const CInetAddress &remoteaddr) | |
Construct a CSock object using an existing connected socket descriptor and its associated remote address. | |
CSock (bool logging=true) | |
void | setLocalAddress () |
Sets the local address. | |
Protected Attributes | |
uint64 | _BytesReceived |
Number of bytes received on this socket. | |
uint64 | _BytesSent |
Number of bytes sent on this socket. | |
volatile bool | _Connected |
True after calling connect(). | |
CInetAddress | _LocalAddr |
Address of local host (valid if connected). | |
bool | _Logging |
If false, do not log any information. | |
bool | _NonBlocking |
If true, the socket is in nonblocking mode. | |
CInetAddress | _RemoteAddr |
Address of the remote host (valid if connected). | |
SOCKET | _Sock |
Socket descriptor. | |
long | _TimeoutMs |
Secondary time out value (ms) for select in dataAvailable(). | |
long | _TimeoutS |
Main time out value (sec) for select in dataAvailable(). | |
Private Attributes | |
uint32 | _MaxReceiveTime |
uint32 | _MaxSendTime |
Static Private Attributes | |
bool | _Initialized |
True if the network library has been initialized. |
|
Definition at line 125 of file sock.h.
00125 { Ok, WouldBlock, ConnectionClosed, Error }; |
|
Destructor (shutdown + close).
|
|
Constructor.
|
|
Construct a CSock object using an existing connected socket descriptor and its associated remote address.
|
|
Returns the number of bytes received since the latest connection.
Definition at line 249 of file sock.h. References uint64. Referenced by NLNET::CBufClient::bytesDownloaded().
00249 { return _BytesReceived; } |
|
Returns the number of bytes sent since the latest connection.
Definition at line 252 of file sock.h. References uint64. Referenced by NLNET::CBufClient::bytesUploaded().
00252 { return _BytesSent; } |
|
Closes the socket (without shutdown) In general you don't need to call this method. But you can call it to:
Reimplemented in NLNET::CDummyTcpSock. Referenced by NLNET::CUdpSimSock::close(), NLNET::CListenTask::close(), NLNET::CTcpSock::connect(), and NLNET::sendEmail(). |
|
Connection. This method does not return a boolean, otherwise a programmer could ignore the result and no exception would be thrown if connection fails :
Reimplemented in NLNET::CDummyTcpSock, and NLNET::CTcpSock. Referenced by NLNET::CUdpSimSock::connect(), and NLNET::CLoginClient::connectToShard(). |
|
Returns if the socket is connected (mutexed).
Referenced by NLNET::CCallbackClient::connect(), NLNET::CBufSock::connect(), NLNET::CBufClient::connect(), NLNET::CUdpSimSock::connected(), NLNET::CLoginClient::connectToShard(), NLNET::CBufServer::disconnect(), NLNET::CBufClient::disconnect(), NLNET::CBufSock::pushBuffer(), NLNET::sendEmail(), NLNET::CBufClient::update(), and NLNET::CBufClient::~CBufClient(). |
|
Creates the socket and get a valid descriptor.
Referenced by NLNET::CListenSock::CListenSock(), NLNET::CTcpSock::connect(), NLNET::CTcpSock::connectWithCustomWindowSize(), and NLNET::CUdpSock::CUdpSock(). |
|
Checks if there is some data to receive, waiting (blocking) at most for the time out value.
Referenced by NLNET::CUdpSimSock::dataAvailable(), and NLNET::CClientReceiveTask::run(). |
|
Returns the socket descriptor.
Definition at line 241 of file sock.h. References _Sock. Referenced by NLNET::CBufSock::asString(), and NLNET::CListenTask::run().
00241 { return _Sock; } |
|
Returns a string explaining the network error (see getLastError()).
|
|
Returns the code of the last error that has occured. Note: This code is platform-dependant. On Unix, it is errno; on Windows it is the Winsock error code. See also errorString() |
|
Gets the send buffer size.
|
|
Returns true if the network engine is initialized.
Definition at line 261 of file sock.h.
00261 { return CSock::_Initialized; }
|
|
Initialize the network engine, if it is not already done.
|
|
Returns a const reference on the local address.
Definition at line 235 of file sock.h. References _LocalAddr. Referenced by NLNET::CLoginServer::init(), NLNET::CUdpSimSock::localAddr(), and NLNET::CListenTask::localAddr().
00235 { return _LocalAddr; } |
|
Returns the nonblocking mode.
Definition at line 166 of file sock.h. References _NonBlocking.
00166 { return _NonBlocking; } |
|
Receive a partial or an entire block of data, depending on nonblocking mode. In blocking mode: the method waits until 'len' bytes have been received. In nonblocking mode: the method reads the bytes that have already been received only, and resets 'len' to the number of bytes read. The actual length may be smaller than the demanded length. In no data is available, the return value is CSock::WouldBlock. If dataAvailable() returns true, you are sure that receive() will not return CSock::WouldBlock. In case of graceful disconnection:
In case of failure (e.g. connection reset by peer) :
Reimplemented in NLNET::CUdpSock. Referenced by NLNET::CNonBlockingBufSock::receivePart(), and NLNET::sendEMailCommand(). |
|
Releases the network engine.
|
|
Returns the address of the remote host.
Definition at line 238 of file sock.h. References _RemoteAddr. Referenced by NLNET::CBufServer::hostAddress(), NLNET::CNonBlockingBufSock::receivePart(), NLNET::CBufClient::remoteAddress(), and NLNET::sendEMailCommand().
00238 { return _RemoteAddr; } |
|
Sends a message. In blocking mode: the method waits until 'len' bytes have been sent. In nonblocking mode : the method resets len to the actual number of bytes sent. Even if less bytes than expected have been sent, it returns CSock::Ok. The caller is expected to test the actual len to check if the remaining data must be resent.
Referenced by NLNET::CBufSock::flush(), NLNET::sendEMailCommand(), and NLNET::CUdpSimSock::sendUDPNow(). |
|
Sets the local address.
Referenced by NLNET::CUdpSock::bind(), and NLNET::CUdpSock::sendTo(). |
|
Sets the socket in nonblocking mode. Call this method *after* connect(), otherwise you will get an "would block" error (10035 on Windows). In nonblocking mode, use received() and sent() instead of receive() and send() Referenced by NLNET::CNonBlockingBufSock::setNonBlocking(). |
|
Sets the send buffer size.
|
|
Change the time out value used in getDataAvailable(), which is 0 by default.
Definition at line 143 of file sock.h. References _TimeoutMs, and _TimeoutS. Referenced by NLNET::CClientReceiveTask::run().
00144 { 00145 _TimeoutS = sec; 00146 _TimeoutMs = ms; 00147 } |
|
Returns the time out value in millisecond.
Definition at line 244 of file sock.h. References _TimeoutMs, _TimeoutS, and uint32.
00244 { return _TimeoutS*1000 + _TimeoutMs; } |
|
Number of bytes received on this socket.
|
|
Number of bytes sent on this socket.
|
|
True after calling connect().
|
|
True if the network library has been initialized.
|
|
Address of local host (valid if connected).
Definition at line 284 of file sock.h. Referenced by localAddr(). |
|
If false, do not log any information.
|
|
|
|
|
|
If true, the socket is in nonblocking mode.
Definition at line 293 of file sock.h. Referenced by nonBlockingMode(). |
|
Address of the remote host (valid if connected).
Definition at line 287 of file sock.h. Referenced by remoteAddr(). |
|
Socket descriptor.
Definition at line 281 of file sock.h. Referenced by descriptor(). |
|
Secondary time out value (ms) for select in dataAvailable().
Definition at line 309 of file sock.h. Referenced by setTimeOutValue(), and timeOutValue(). |
|
Main time out value (sec) for select in dataAvailable().
Definition at line 306 of file sock.h. Referenced by setTimeOutValue(), and timeOutValue(). |