2525 // To match windows's constants
2626 static constexpr int INVALID_SOCKET = -1 ;
2727 static constexpr int SOCKET_ERROR = -1 ;
28+
29+ #include < arpa/inet.h>
30+ #include < unistd.h>
2831#endif
2932
3033static constexpr int BUFF_SIZE = 4096 ;
@@ -35,7 +38,6 @@ static constexpr int BUFF_SIZE = 4096;
3538#include < sstream>
3639#include < stdexcept>
3740
38-
3941// TODO add exceptions on error retunrs
4042// TODO throw custom exceptions on invalid status (eg: socket already connected)
4143namespace CppSockets {
@@ -44,8 +46,8 @@ namespace CppSockets {
4446 {
4547 socklen_t len = sizeof (int );
4648
47- Socket::getsockopt (sockfd, SOL_SOCKET, SO_TYPE, &m_type, &len);
48- #if !defined (OS_APPLE) && !defined (OS_WINDOWS)
49+ Socket::getsockopt (sockfd, SOL_SOCKET, SO_TYPE, (SockOptType *) &m_type, &len);
50+ #ifdef OS_LINUX
4951 Socket::getsockopt (sockfd, SOL_SOCKET, SO_DOMAIN, &m_domain, &len);
5052 Socket::getsockopt (sockfd, SOL_SOCKET, SO_PROTOCOL, &m_protocol, &len);
5153#endif
@@ -95,7 +97,7 @@ namespace CppSockets {
9597 close ();
9698 }
9799
98- int Socket::getsockopt (int fd, int level, int optname, void *optval, socklen_t *optlen) {
100+ int Socket::getsockopt (int fd, int level, int optname, SockOptType *optval, socklen_t *optlen) {
99101 int ret = ::getsockopt (fd, level, optname, optval, optlen);
100102
101103 if (ret == SOCKET_ERROR) {
@@ -109,14 +111,12 @@ namespace CppSockets {
109111 }
110112
111113 char *Socket::strerror (int err) {
112- #ifdef OS_WINDOWS
113- #else
114114 return ::strerror (err);
115- #endif
116115 }
117116
118117 int Socket::get_errno () {
119118#ifdef OS_WINDOWS
119+ return WSAGetLastError ();
120120#else
121121 return errno;
122122#endif
@@ -170,14 +170,14 @@ namespace CppSockets {
170170 int Socket::set_reuseaddr (bool value) {
171171 int val = value;
172172
173- return this ->setsockopt (SOL_SOCKET, SO_REUSEADDR, &val, sizeof (val));
173+ return this ->setsockopt (SOL_SOCKET, SO_REUSEADDR, (SockOptType *) &val, sizeof (val));
174174 }
175175
176- int Socket::getsockopt (int level, int optname, void *optval, socklen_t *optlen) {
176+ int Socket::getsockopt (int level, int optname, SockOptType *optval, socklen_t *optlen) {
177177 return this ->getsockopt (m_sockfd, level, optname, optval, optlen);
178178 }
179179
180- int Socket::setsockopt (int level, int optname, const void *optval, socklen_t optlen) {
180+ int Socket::setsockopt (int level, int optname, const SockOptType *optval, socklen_t optlen) {
181181 int ret = ::setsockopt (m_sockfd, level, optname, optval, optlen);
182182
183183 if (ret < 0 ) {
@@ -257,6 +257,13 @@ namespace CppSockets {
257257 }
258258
259259 void Socket::set_blocking (bool val) {
260+ #ifdef OS_WINDOWS
261+ u_long mode = val ? 0 : 1 ;
262+ int result = ioctlsocket (m_sockfd, FIONBIO, &mode);
263+ if (result != NO_ERROR) {
264+ throw std::runtime_error (std::string (" Failed to change socket: " ) + Socket::strerror ());
265+ }
266+ #else
260267 int flags = fcntl (m_sockfd, F_GETFL, 0 );
261268 int ret = flags;
262269
@@ -270,6 +277,7 @@ namespace CppSockets {
270277 if (ret < 0 ) {
271278 throw std::runtime_error (std::string (" Failed to change socket: " ) + Socket::strerror ());
272279 }
280+ #endif
273281 }
274282
275283 RawSocketType Socket::get_fd () const {
0 commit comments