SocketState SocketImpl::Listen(SocketHandle handle, const IpAddress& address, unsigned queueSize, SocketError* error) { NazaraAssert(handle != InvalidHandle, "Invalid handle"); NazaraAssert(address.IsValid(), "Invalid address"); IpAddressImpl::SockAddrBuffer nameBuffer; int bufferLength = IpAddressImpl::ToSockAddr(address, nameBuffer.data()); if (bind(handle, reinterpret_cast<const sockaddr*>(&nameBuffer), bufferLength) == SOCKET_ERROR) { if (error) *error = TranslateWSAErrorToSocketError(WSAGetLastError()); return SocketState_NotConnected; } if (listen(handle, queueSize) == SOCKET_ERROR) { if (error) *error = TranslateWSAErrorToSocketError(WSAGetLastError()); return SocketState_NotConnected; } if (error) *error = SocketError_NoError; return SocketState_Bound; }
String IpAddress::ResolveAddress(const IpAddress& address, String* service, ResolveError* error) { NazaraAssert(address.IsValid(), "Invalid address"); String hostname; IpAddressImpl::ResolveAddress(address, &hostname, service, error); return hostname; }
SocketState UdpSocket::Bind(const IpAddress& address) { NazaraAssert(m_handle != SocketImpl::InvalidHandle, "Socket hasn't been created"); NazaraAssert(address.IsValid(), "Invalid address"); SocketState state = SocketImpl::Bind(m_handle, address, &m_lastError); if (state == SocketState_Bound) m_boundAddress = SocketImpl::QuerySocketAddress(m_handle); UpdateState(state); return state; }
SocketState TcpServer::Listen(const IpAddress& address, unsigned int queueSize) { NazaraAssert(address.IsValid(), "Invalid address"); Open(address.GetProtocol()); SocketState state = SocketImpl::Listen(m_handle, address, queueSize, &m_lastError); if (state == SocketState_Bound) m_boundAddress = SocketImpl::QuerySocketAddress(m_handle); UpdateState(state); return state; }
/*! * \brief Sends multiple buffers as one datagram * \return true If data were sent * * \param to Destination IpAddress (must match socket protocol) * \param buffers A pointer to an array of NetBuffer containing buffers and size data * \param size Number of NetBuffer to send * \param sent Optional argument to get the number of bytes sent */ bool UdpSocket::SendMultiple(const IpAddress& to, const NetBuffer* buffers, std::size_t bufferCount, std::size_t* sent) { NazaraAssert(to.IsValid(), "Invalid ip address"); NazaraAssert(to.GetProtocol() == m_protocol, "IP Address has a different protocol than the socket"); NazaraAssert(buffers && bufferCount > 0, "Invalid buffer"); int byteSent; if (!SocketImpl::SendMultiple(m_handle, buffers, bufferCount, to, &byteSent, &m_lastError)) return false; if (sent) *sent = byteSent; return true; }
bool UdpSocket::Send(const IpAddress& to, const void* buffer, std::size_t size, std::size_t* sent) { NazaraAssert(to.IsValid(), "Invalid ip address"); NazaraAssert(to.GetProtocol() == m_protocol, "IP Address has a different protocol than the socket"); NazaraAssert(buffer && size > 0, "Invalid buffer"); int byteSent; if (!SocketImpl::SendTo(m_handle, buffer, static_cast<int>(size), to, &byteSent, &m_lastError)) return false; if (sent) *sent = byteSent; return true; }
SocketState SocketImpl::Connect(SocketHandle handle, const IpAddress& address, SocketError* error) { NazaraAssert(handle != InvalidHandle, "Invalid handle"); NazaraAssert(address.IsValid(), "Invalid address"); IpAddressImpl::SockAddrBuffer nameBuffer; int bufferLength = IpAddressImpl::ToSockAddr(address, nameBuffer.data()); if (error) *error = SocketError_NoError; // Clear socket error status ClearErrorCode(handle); if (connect(handle, reinterpret_cast<const sockaddr*>(nameBuffer.data()), bufferLength) == SOCKET_ERROR) { int errorCode = WSAGetLastError(); switch (errorCode) //< Check for "normal errors" first { case WSAEALREADY: case WSAEWOULDBLOCK: return SocketState_Connecting; case WSAEISCONN: return SocketState_Connected; } if (error) { if (errorCode == WSAEADDRNOTAVAIL) *error = SocketError_ConnectionRefused; //< ConnectionRefused seems more legit than AddressNotAvailable in connect case else *error = TranslateWSAErrorToSocketError(errorCode); } return SocketState_NotConnected; } return SocketState_Connected; }
SocketState TcpClient::Connect(const IpAddress& remoteAddress) { NazaraAssert(remoteAddress.IsValid(), "Invalid remote address"); NazaraAssert(remoteAddress.GetPort() != 0, "Remote address has no port"); Disconnect(); Open(remoteAddress.GetProtocol()); CallOnExit restoreBlocking; if (m_isBlockingEnabled) { SocketImpl::SetBlocking(m_handle, false); restoreBlocking.Reset([this] () { SocketImpl::SetBlocking(m_handle, true); }); } SocketState state = SocketImpl::Connect(m_handle, remoteAddress, &m_lastError); m_peerAddress = (state != SocketState_NotConnected) ? remoteAddress : IpAddress::Invalid; UpdateState(state); return state; }