void Socket::IOCtl(long cmd, unsigned long *argp) { CRYPTOPP_ASSERT(m_s != INVALID_SOCKET); #ifdef USE_WINDOWS_STYLE_SOCKETS CheckAndHandleError_int("ioctlsocket", ioctlsocket(m_s, cmd, argp)); #else CheckAndHandleError_int("ioctl", ioctl(m_s, cmd, argp)); #endif }
void Socket::CloseSocket() { if (m_s != INVALID_SOCKET) { #ifdef USE_WINDOWS_STYLE_SOCKETS CancelIo((HANDLE) m_s); CheckAndHandleError_int("closesocket", closesocket(m_s)); #else CheckAndHandleError_int("close", close(m_s)); #endif m_s = INVALID_SOCKET; SocketChanged(); } }
bool Socket::Connect(const char *addr, unsigned int port) { assert(addr != NULL); sockaddr_in sa; memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_addr.s_addr = inet_addr(addr); if (sa.sin_addr.s_addr == INADDR_NONE) { hostent *lphost = gethostbyname(addr); if (lphost == NULL) { SetLastError(SOCKET_EINVAL); CheckAndHandleError_int("gethostbyname", SOCKET_ERROR); } else { assert(IsAlignedOn(lphost->h_addr,GetAlignmentOf<in_addr>())); sa.sin_addr.s_addr = ((in_addr *)(void *)lphost->h_addr)->s_addr; } } sa.sin_port = htons((u_short)port); return Connect((const sockaddr *)&sa, sizeof(sa)); }
unsigned int Socket::Send(const byte* buf, size_t bufLen, int flags) { CRYPTOPP_ASSERT(m_s != INVALID_SOCKET); int result = send(m_s, (const char *)buf, UnsignedMin(INT_MAX, bufLen), flags); CheckAndHandleError_int("send", result); return result; }
unsigned int Socket::Receive(byte* buf, size_t bufLen, int flags) { CRYPTOPP_ASSERT(m_s != INVALID_SOCKET); int result = recv(m_s, (char *)buf, UnsignedMin(INT_MAX, bufLen), flags); CheckAndHandleError_int("recv", result); return result; }
bool Socket::Connect(const char *addr, unsigned int port) { CRYPTOPP_ASSERT(addr != NULL); sockaddr_in sa; memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_addr.s_addr = inet_addr(addr); if (sa.sin_addr.s_addr == static_cast<unsigned int>(-1)) // Solaris doesn't have INADDR_NONE { hostent *lphost = gethostbyname(addr); if (lphost == NULL) { SetLastError(SOCKET_EINVAL); CheckAndHandleError_int("gethostbyname", SOCKET_ERROR); } sa.sin_addr.s_addr = ((in_addr *)lphost->h_addr)->s_addr; } sa.sin_port = htons((u_short)port); return Connect((const sockaddr *)&sa, sizeof(sa)); }
bool Socket::Connect(const sockaddr* psa, socklen_t saLen) { CRYPTOPP_ASSERT(m_s != INVALID_SOCKET); int result = connect(m_s, const_cast<sockaddr*>(psa), saLen); if (result == SOCKET_ERROR && GetLastError() == SOCKET_EWOULDBLOCK) return false; CheckAndHandleError_int("connect", result); return true; }
void Socket::CloseSocket() { if (m_s != INVALID_SOCKET) { #ifdef USE_WINDOWS_STYLE_SOCKETS # if defined(USE_WINDOWS8_API) BOOL result = CancelIoEx((HANDLE) m_s, NULL); assert(result || (!result && GetLastError() == ERROR_NOT_FOUND)); CheckAndHandleError_int("closesocket", closesocket(m_s)); # else BOOL result = CancelIo((HANDLE) m_s); assert(result || (!result && GetLastError() == ERROR_NOT_FOUND)); CheckAndHandleError_int("closesocket", closesocket(m_s)); # endif #else CheckAndHandleError_int("close", close(m_s)); #endif m_s = INVALID_SOCKET; SocketChanged(); } }
bool Socket::ReceiveReady(const timeval *timeout) { fd_set fds; FD_ZERO(&fds); FD_SET(m_s, &fds); int ready; if (timeout == NULL) ready = select((int)m_s+1, &fds, NULL, NULL, NULL); else { timeval timeoutCopy = *timeout; // select() modified timeout on Linux ready = select((int)m_s+1, &fds, NULL, NULL, &timeoutCopy); } CheckAndHandleError_int("select", ready); return ready > 0; }
bool Socket::ReceiveReady(const timeval *timeout) { fd_set fds; FD_ZERO(&fds); FD_SET(m_s, &fds); #ifdef CRYPTOPP_MSAN __msan_unpoison(&fds, sizeof(fds)); #endif int ready; if (timeout == NULL) ready = select((int)m_s+1, &fds, NULL, NULL, NULL); else { timeval timeoutCopy = *timeout; // select() modified timeout on Linux ready = select((int)m_s+1, &fds, NULL, NULL, &timeoutCopy); } CheckAndHandleError_int("select", ready); return ready > 0; }
void Socket::Bind(unsigned int port, const char *addr) { sockaddr_in sa; memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; if (addr == NULL) sa.sin_addr.s_addr = htonl(INADDR_ANY); else { unsigned long result = inet_addr(addr); if (result == static_cast<unsigned long>(-1)) // Solaris doesn't have INADDR_NONE { SetLastError(SOCKET_EINVAL); CheckAndHandleError_int("inet_addr", SOCKET_ERROR); } sa.sin_addr.s_addr = result; } sa.sin_port = htons((u_short)port); Bind((sockaddr *)&sa, sizeof(sa)); }
void Socket::Listen(int backlog) { assert(m_s != INVALID_SOCKET); CheckAndHandleError_int("listen", listen(m_s, backlog)); }
void Socket::ShutDown(int how) { CRYPTOPP_ASSERT(m_s != INVALID_SOCKET); int result = shutdown(m_s, how); CheckAndHandleError_int("shutdown", result); }
void Socket::GetSockName(sockaddr *psa, socklen_t *psaLen) { assert(m_s != INVALID_SOCKET); CheckAndHandleError_int("getsockname", getsockname(m_s, psa, psaLen)); }
void Socket::Bind(const sockaddr *psa, socklen_t saLen) { CRYPTOPP_ASSERT(m_s != INVALID_SOCKET); // cygwin workaround: needs const_cast CheckAndHandleError_int("bind", bind(m_s, const_cast<sockaddr *>(psa), saLen)); }
void Socket::GetPeerName(sockaddr *psa, socklen_t *psaLen) { CRYPTOPP_ASSERT(m_s != INVALID_SOCKET); CheckAndHandleError_int("getpeername", getpeername(m_s, psa, psaLen)); }
void Socket::Listen(int backlog) { CRYPTOPP_ASSERT(m_s != INVALID_SOCKET); CheckAndHandleError_int("listen", listen(m_s, backlog)); }