int UDPSocketImpl::read(void *data, int size, SocketName &endpoint) { sockaddr_in addr; int addr_len = sizeof(sockaddr_in); int result = recvfrom(handle, static_cast<char*>(data), size, 0, (sockaddr *)&addr, &addr_len); if (result == SOCKET_ERROR) { int last_error = WSAGetLastError(); // To do: maybe return different return values for sending errors if (last_error == WSAEWOULDBLOCK || last_error == WSAEMSGSIZE || last_error == WSAECONNRESET || last_error == WSAENETRESET) { endpoint = SocketName(); return -1; } else { throw Exception("Error reading from udp socket"); } } endpoint = SocketName(); endpoint.from_sockaddr(AF_INET, (sockaddr *)&addr, addr_len); return result; }
void NetGameServer::start(const std::string &address, const std::string &port) { stop(); impl->stop_event.reset(); impl->tcp_listen.reset(new TCPListen(SocketName(address, port))); impl->listen_thread.start(this, &NetGameServer::listen_thread_main); }
void NetGameServer::start(const std::string &address, const std::string &port) { stop(); std::unique_lock<std::mutex> lock(impl->mutex); impl->stop_flag = false; lock.unlock(); impl->tcp_listen.reset(new TCPListen(SocketName(address, port))); impl->listen_thread = std::thread(&NetGameServer::listen_thread_main, this); }
TCPConnection TCPListen::accept(SocketName &out_end_point) { sockaddr_in peer_address = { 0 }; int peer_address_length = sizeof(sockaddr_in); SOCKET result = ::accept(impl->handle, reinterpret_cast<sockaddr*>(&peer_address), &peer_address_length); if (result == INVALID_SOCKET) { if (WSAGetLastError() == WSAEWOULDBLOCK) return TCPConnection(); else throw Exception("Error accepting from socket"); } out_end_point = SocketName(); out_end_point.from_sockaddr(AF_INET, reinterpret_cast<sockaddr*>(&peer_address), peer_address_length); return TCPConnection(std::make_shared<TCPSocket>(result)); }
int UDPSocketImpl::read(void *data, int size, SocketName &endpoint) { sockaddr_in addr; socklen_t addr_len = sizeof(sockaddr_in); int result = recvfrom(handle, static_cast<char*>(data), size, 0, (sockaddr *)&addr, &addr_len); if (result == -1) { if (errno == EWOULDBLOCK || errno == EMSGSIZE || errno == ECONNRESET || errno == ENETRESET) { endpoint = SocketName(); return -1; } else { throw Exception("Error reading from udp socket"); } } endpoint.from_sockaddr(AF_INET, (sockaddr *)&addr, addr_len); return result; }
void NetGameClient::connect(const std::string &server, const std::string &port) { disconnect(); impl->connection.reset(new NetGameConnection(this, SocketName(server, port))); }
SocketName UDPSocket_Impl::get_local_name() const { return SocketName(); }