X-Git-Url: http://git.tdb.fi/?p=libs%2Fnet.git;a=blobdiff_plain;f=source%2Fnet%2Fwindows%2Fsocket.cpp;fp=source%2Fnet%2Fwindows%2Fsocket.cpp;h=f4fab44c478d491f0677b333dfc26a853113be78;hp=0000000000000000000000000000000000000000;hb=88bbb4039aa274c7f41ebe3a18085b63427e5475;hpb=6f6845971a21c2d7e04b87925f5e657f0f20ca0d diff --git a/source/net/windows/socket.cpp b/source/net/windows/socket.cpp new file mode 100644 index 0000000..f4fab44 --- /dev/null +++ b/source/net/windows/socket.cpp @@ -0,0 +1,113 @@ +#include +#include "platform_api.h" +#include +#include +#include "sockaddr_private.h" +#include "socket.h" +#include "socket_private.h" + +namespace { + +class WinSockHelper +{ +public: + WinSockHelper() + { + WSADATA wsa_data; + int err = WSAStartup(0x0002, &wsa_data); + if(err) + std::cerr<<"Failed to initialize WinSock: "<event = CreateEvent(0, false, false, 0); +} + +void Socket::platform_cleanup() +{ + closesocket(priv->handle); + CloseHandle(*priv->event); +} + +void Socket::set_timeout(const Time::TimeDelta &timeout) +{ + DWORD msecs = static_cast(timeout/Time::msec); + priv->set_option(SOL_SOCKET, SO_RCVTIMEO, &msecs, sizeof(DWORD)); + priv->set_option(SOL_SOCKET, SO_SNDTIMEO, &msecs, sizeof(DWORD)); +} + +void Socket::set_platform_events(unsigned e) +{ + long ws_events = 0; + if(e&S_INPUT) + ws_events |= FD_READ|FD_CLOSE; + if(e&S_CONNECT) + ws_events |= FD_CONNECT; + if(e&S_ACCEPT) + ws_events |= FD_ACCEPT; + WSAEventSelect(priv->handle, *priv->event, ws_events); +} + + +void Socket::Private::set_block(bool b) +{ + u_long flag = !b; + ioctlsocket(handle, FIONBIO, &flag); +} + +int Socket::Private::set_option(int level, int optname, const void *optval, socklen_t optlen) +{ + return setsockopt(handle, level, optname, reinterpret_cast(optval), optlen); +} + +int Socket::Private::get_option(int level, int optname, void *optval, socklen_t *optlen) +{ + return getsockopt(handle, level, optname, reinterpret_cast(optval), optlen); +} + + +unsigned check_sys_error(int ret, const char *func) +{ + if(ret<0) + { + int err_code = WSAGetLastError(); + if(err_code==WSAEWOULDBLOCK) + return 0; + else + throw system_error(func, err_code); + } + + return ret; +} + +bool check_sys_connect_error(int ret) +{ + if(ret==SOCKET_ERROR) + { + int err_code = WSAGetLastError(); + if(err_code==WSAEWOULDBLOCK) + return false; + else + throw system_error("connect", err_code); + } + + return true; +} + +} // namespace Net +} // namespace Msp