This is easy:
// Choose one of these. It'll return once a connection is established. Endpoint ep(TCP | CLIENT, "example.com:80"); // Active open Endpoint ep(TCP | SERVER, ":80"); // Passive open Endpoint ep(UDP | CLIENT, "example.com:41170"); // Send Endpoint ep(UDP | SERVER, ":41170"); // Receive if (!ep) // If couldn't open socket std::cout << "failed: " << std::endl; // Print out the local and remote address std::cout << "New socket: " << ep << std::endl; // Find out who we're connected to (note that this is shown above also) std::cout << "Connected to: " << string(ep.m_remote) << std::endl; // Write some data ep.Write("hi");
If your host supports it, IPv6 will be automatically enabled. DNS names will resolve to 128-bit IPv6 addresses. To specifically use IPv6:
EndpointAddrlist::g_default_family = AF_INET6;
Now all DNS names will resolve to IPv6 addresses. (See also: RES_USE_INET6)
To connect to an IPv6 host without DNS, simply write the address. Use square brackets around the IPv6 address if you're also specifying a port. For example, to connect to a local web server you're running on IPv6:
Endpoint ep(TCP | CLIENT, "[::1]:80");
If you have IPv6 support but don't want it to get in the way, use:
EndpointAddrlist::g_default_family = AF_INET;
Endpoint now supports raw sockets with IPv4 (IPv6 doesn't have raw sockets; you have to use datalink access for that, which Endpoint doesn't currently support). If you want to write your own IP header, use RAW.
A number of transport-layer protocols that sit on top of IPv4 are available to Endpoint. To write IGMP packets, for example, use RAW_ICMP. This will make the IP header for you, but you have to write the IGMP header.
RAW_UDP and RAW_ICMP automatically create the UDP or ICMP header for you. See the next topic for using ICMP.
Simply create a RAW_ICMP | CLIENT socket with your destined address, specifying a port number of type,code. For example, to send a "host unreachable" ICMP message to 10.3.2.1:
Endpoint ep(RAW_ICMP | CLIENT, "10.3.2.1:3,1"); ep.Write("...");
To send a "ping" (ICMP echo request), replace "3,1" with "8,0". See the official IANA ICMP parameters for more information.
ICMP can be used as a covert channel. See Project Loki: ICMP Tunnelling in Phrack 49, by Alhambra and daemon9 for an article about this steganographic process.