48#if LASS_PLATFORM_TYPE == LASS_PLATFORM_TYPE_WIN32
49# pragma comment(lib, "ws2_32.lib")
59class SocketImpl:
public util::NonCopyable
63 typedef Socket::TPort TPort;
66 socket_(INVALID_SOCKET)
69 if (::WSAStartup(0x0202, &wsaData) != 0)
71 LASS_THROW_EX(SocketError,
"Failed to startup Windows Socket API.");
73 if (wsaData.wVersion != 0x0202)
76 LASS_THROW_EX(SocketError,
"Windows Socket API is not version 2.2.");
86 catch (
const std::exception& error)
88 std::cerr <<
"[LASS RUN MSG] WARNING: closeSocket() failed: " << error.what();
90 [[maybe_unused]]
const int err = ::WSACleanup();
91 LASS_ASSERT(err == 0);
94 void bind(
const std::string& address, TPort port)
99 addr.sin_family = AF_INET;
100 addr.sin_addr.s_addr = address.empty() ? ::htonl(INADDR_ANY) : ::inet_addr(address.c_str());
101 addr.sin_port = ::htons(port);
103 if (::bind(socket_, (LPSOCKADDR)&addr,
sizeof(addr)) != 0)
105 LASS_THROW_EX(SocketError,
"Failed to bind socket to port " << port);
111 LASS_ASSERT(socket_ != INVALID_SOCKET);
112 ::listen(socket_, SOMAXCONN);
115 void accept(SocketImpl* connection)
const
117 LASS_ASSERT(socket_ != INVALID_SOCKET);
118 SOCKET conn = ::accept(socket_, 0, 0);
119 if (conn == INVALID_SOCKET)
121 LASS_THROW_EX(SocketError,
"Failed to accept connection");
123 LASS_ASSERT(connection);
124 connection->socket_ = conn;
127 void connect(
const std::string& address, TPort port)
132 dest.sin_family = AF_INET;
133 dest.sin_addr.s_addr = ::inet_addr(address.c_str());
134 dest.sin_port = ::htons(port);
135 const int ret = ::connect(socket_,
reinterpret_cast<SOCKADDR*
>(&dest),
sizeof(dest));
136 if (ret == SOCKET_ERROR)
138 LASS_THROW_EX(SocketError,
"could not connect " << address <<
":" << port);
142 std::string address()
const
145 addr.sin_family = AF_INET;
146 int size =
sizeof(addr);
147 if (::getsockname(socket_, (LPSOCKADDR)&addr, &size) != 0)
149 LASS_THROW_EX(SocketError,
"Failed to retrieve address");
151 return ::inet_ntoa(addr.sin_addr);
157 addr.sin_family = AF_INET;
158 int size =
sizeof(addr);
159 if (::getsockname(socket_, (LPSOCKADDR)&addr, &size) != 0)
161 LASS_THROW_EX(SocketError,
"Failed to retrieve port number");
163 return ::ntohs(addr.sin_port);
166 int send(
const void* begin,
int length)
const
168 LASS_ASSERT(socket_ != INVALID_SOCKET);
169 const int ret = ::send(socket_,
static_cast<const char*
>(begin), length, 0);
170 if (ret == SOCKET_ERROR)
172 LASS_THROW_EX(SocketError,
"Failure to send data: " << WSAGetLastError());
174 LASS_ASSERT(ret >= 0);
178 int receive(
void* begin,
int length)
const
180 const int ret = ::recv(socket_,
static_cast<char*
>(begin), length, 0);
181 if (ret == SOCKET_ERROR)
183 LASS_THROW_EX(SocketError,
"Failure to receive data: " << WSAGetLastError());
185 LASS_ASSERT(ret >= 0);
189 int sizeSendBuffer()
const
191 LASS_ASSERT(socket_ != INVALID_SOCKET);
193 int optlen =
sizeof(size);
194 const int ret = ::getsockopt(socket_, SOL_SOCKET, SO_SNDBUF,
reinterpret_cast<char*
>(&size), &optlen);
195 if (ret == SOCKET_ERROR || optlen !=
sizeof(size))
197 LASS_THROW_EX(SocketError,
"failed to query send buffer size");
204 if (socket_ != INVALID_SOCKET)
208 socket_ = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
209 if (socket_ == INVALID_SOCKET)
211 LASS_THROW_EX(SocketError,
"Failed to create socket.");
216 if (socket_ == INVALID_SOCKET)
220 const int err = ::closesocket(socket_);
223 LASS_THROW_EX(SocketError,
"Failed to close socket");
225 socket_ = INVALID_SOCKET;
streams, binary streams, vrmlstreams, ...
Library for Assembled Shared Sources.