socket.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include "io_common.h"
00044 #include "socket.h"
00045
00046 #if LASS_HAVE_SYS_SOCKET_H && !defined(LASS_IO_SOCKET_HAVE_LIBC)
00047 # define LASS_IO_SOCKET_HAVE_LIBC
00048 #endif
00049
00050 #if defined(LASS_IO_SOCKET_HAVE_WINSOCK)
00051 # include "impl/socket_winsock.inl"
00052 #elif defined(LASS_IO_SOCKET_HAVE_LIBC)
00053 # include "impl/socket_libc.inl"
00054 #else
00055 # error "[LASS BUILD MSG] Socket not supported for this platform"
00056 #endif
00057
00058 #if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
00059 # pragma warning(push)
00060 # pragma warning(disable: 4244) // conversion from '__w64 int' to 'cont int', possible loss of data
00061 #endif
00062
00063 namespace lass
00064 {
00065 namespace io
00066 {
00067
00068 Socket::Socket()
00069 {
00070 pimpl_ = new impl::SocketImpl;
00071 }
00072
00073
00074
00075
00076 Socket::~Socket()
00077 {
00078 LASS_ASSERT(pimpl_);
00079 impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00080 delete pimpl;
00081 pimpl_ = 0;
00082 }
00083
00084
00085
00086 void Socket::bind(unsigned short iPortNumber)
00087 {
00088 LASS_ASSERT(pimpl_);
00089 impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00090 pimpl->bind(iPortNumber);
00091 }
00092
00093
00094
00095 void Socket::listen()
00096 {
00097 LASS_ASSERT(pimpl_);
00098 impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00099 pimpl->listen();
00100 }
00101
00102
00103
00104 void Socket::accept(Socket& oConnection)
00105 {
00106 LASS_ASSERT(pimpl_);
00107 impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00108 LASS_ASSERT(oConnection.pimpl_);
00109 impl::SocketImpl* connection = static_cast<impl::SocketImpl*>(oConnection.pimpl_);
00110 pimpl->accept(connection);
00111 }
00112
00113
00114
00115 void Socket::connect(const std::string& iIpAddress, unsigned short iPort)
00116 {
00117 LASS_ASSERT(pimpl_);
00118 impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00119 pimpl->connect(iIpAddress, iPort);
00120 }
00121
00122
00123 const int Socket::send(const void* iBegin, int iLength)
00124 {
00125 LASS_ASSERT(pimpl_);
00126 impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00127 return pimpl->send(iBegin, iLength);
00128 }
00129
00130
00131
00132 const void* const Socket::send(const void* iBegin, const void* iEnd)
00133 {
00134 LASS_ASSERT(pimpl_);
00135 impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00136 const char* begin = static_cast<const char*>(iBegin);
00137 const char* end = static_cast<const char*>(iEnd);
00138 const int length = end - begin;
00139 const int sent = pimpl->send(begin, length);
00140 LASS_ASSERT(sent >= 0);
00141 return begin + sent;
00142 }
00143
00144
00145
00146 const int Socket::receive(void* iBegin, int iLength)
00147 {
00148 LASS_ASSERT(pimpl_);
00149 impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00150 return pimpl->receive(iBegin, iLength);
00151 }
00152
00153
00154
00155 void* const Socket::receive(void* iBegin, void* iEnd)
00156 {
00157 LASS_ASSERT(pimpl_);
00158 impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00159 char* begin = static_cast<char*>(iBegin);
00160 char* end = static_cast<char*>(iEnd);
00161 const int length = end - begin;
00162 const int sent = pimpl->receive(begin, length);
00163 LASS_ASSERT(sent >= 0);
00164 return begin + sent;
00165 }
00166
00167
00168
00169 void Socket::swap(Socket& ioOther)
00170 {
00171 std::swap(pimpl_, ioOther.pimpl_);
00172 }
00173
00174
00175
00176 }
00177 }
00178
00179