// peer void Connection::connect(Address addr) { m_last_recieved = porting::getTimeMs(); //MutexAutoLock peerlock(m_peers_mutex); //m_peers.lock_unique_rec(); auto node = m_peers.find(PEER_ID_SERVER); if(node != m_peers.end()){ //throw ConnectionException("Already connected to a server"); ConnectionEvent ev(CONNEVENT_CONNECT_FAILED); putEvent(ev); } m_enet_host = enet_host_create(NULL, 1, 0, 0, 0); ENetAddress address; #if defined(ENET_IPV6) if (!addr.isIPv6()) inet_pton (AF_INET6, ("::ffff:"+addr.serializeString()).c_str(), &address.host); else address.host = addr.getAddress6().sin6_addr; #else if (addr.isIPv6()) { //throw ConnectionException("Cant connect to ipv6 address"); ConnectionEvent ev(CONNEVENT_CONNECT_FAILED); putEvent(ev); } else { address.host = addr.getAddress().sin_addr.s_addr; } #endif address.port = addr.getPort(); ENetPeer *peer = enet_host_connect(m_enet_host, &address, CHANNEL_COUNT, 0); peer->data = new u16; *((u16*)peer->data) = PEER_ID_SERVER; ENetEvent event; int ret = enet_host_service (m_enet_host, & event, 5000); if (ret > 0 && event.type == ENET_EVENT_TYPE_CONNECT) { m_peers.set(PEER_ID_SERVER, peer); m_peers_address.set(PEER_ID_SERVER, addr); } else { errorstream<<"connect enet_host_service ret="<<ret<<std::endl; if (ret == 0) { ConnectionEvent ev(CONNEVENT_CONNECT_FAILED); putEvent(ev); } /* Either the 5 seconds are up or a disconnect event was */ /* received. Reset the peer in the event the 5 seconds */ /* had run out without any significant event. */ enet_peer_reset(peer); } }
// host void Connection::serve(Address bind_addr) { ENetAddress address; #if defined(ENET_IPV6) address.host = bind_addr.getAddress6().sin6_addr; // in6addr_any; #else address.host = bind_addr.getAddress().sin_addr.s_addr; // ENET_HOST_ANY; #endif address.port = bind_addr.getPort(); // fmtodo m_enet_host = enet_host_create(&address, g_settings->getU16("max_users"), CHANNEL_COUNT, 0, 0); if (m_enet_host == NULL) { ConnectionEvent ev(CONNEVENT_BIND_FAILED); putEvent(ev); } }
void TestSocket::testIPv6Socket() { Address address6((IPv6AddressBytes *)NULL, port); UDPSocket socket6; if (!socket6.init(true, true)) { /* Note: Failing to create an IPv6 socket is not technically an error because the OS may not support IPv6 or it may have been disabled. IPv6 is not /required/ by minetest and therefore this should not cause the unit test to fail */ dstream << "WARNING: IPv6 socket creation failed (unit test)" << std::endl; return; } const char sendbuffer[] = "hello world!"; IPv6AddressBytes bytes; bytes.bytes[15] = 1; socket6.Bind(address6); try { socket6.Send(Address(&bytes, port), sendbuffer, sizeof(sendbuffer)); sleep_ms(50); char rcvbuffer[256] = { 0 }; Address sender; for(;;) { if (socket6.Receive(sender, rcvbuffer, sizeof(rcvbuffer)) < 0) break; } //FIXME: This fails on some systems UASSERT(strncmp(sendbuffer, rcvbuffer, sizeof(sendbuffer)) == 0); UASSERT(memcmp(sender.getAddress6().sin6_addr.s6_addr, Address(&bytes, 0).getAddress6().sin6_addr.s6_addr, 16) == 0); } catch (SendFailedException &e) { errorstream << "IPv6 support enabled but not available!" << std::endl; } }