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.