Skip to content

Instantly share code, notes, and snippets.

@lethee
Created February 15, 2016 06:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lethee/412c5cd3bb73fd04f98f to your computer and use it in GitHub Desktop.
Save lethee/412c5cd3bb73fd04f98f to your computer and use it in GitHub Desktop.
ipv4 ipv6 getaddrinfo instead of gethostbyname
// g++ -Wall -o get get.cpp && ./get ::ffff:192.168.111.8 3000
// g++ -Wall -o get get.cpp && ./get 192.168.111.8 3000
// g++ -Wall -o get get.cpp && ./get www.google.com 80
#include <iostream>
#include <cstdlib>
#include <sys/socket.h>
#include <netdb.h>
#include <cstring>
#include <arpa/inet.h>
#include <unistd.h>
using namespace std;
int main(int argc, char *argv[])
{
if (argc != 3) {
cerr << "Usage: " << argv[0] << " serverAddr port" << endl;
return 1;
}
int ret = 0;
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
struct addrinfo *result;
struct addrinfo *rp;
// list local addresses
ret = getaddrinfo(NULL, "80", &hints, &result);
if (ret != 0) {
cerr << "getaddrinfo: " << gai_strerror(ret) << endl;
return 1;
}
for (rp = result; rp != NULL; rp = rp->ai_next) {
struct sockaddr_in *addr_in = (struct sockaddr_in *)rp->ai_addr;
struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)rp->ai_addr;
char address[INET6_ADDRSTRLEN];
switch (rp->ai_family) {
case AF_INET:
inet_ntop(AF_INET, &addr_in->sin_addr, address, sizeof(address));
cout << "local ipv4 " << address << endl;
break;
case AF_INET6:
inet_ntop(AF_INET6, &addr_in6->sin6_addr, address, sizeof(address));
cout << "local ipv6 " << address << endl;
break;
}
}
// connect target
string servAddr = argv[1];
string servPort = argv[2];
ret = getaddrinfo(servAddr.c_str(), servPort.c_str(), &hints, &result);
if (ret != 0) {
cerr << "getaddrinfo: " << gai_strerror(ret) << endl;
return 1;
}
for (rp = result; rp != NULL; rp = rp->ai_next) {
if (rp->ai_family == AF_INET || rp->ai_family == AF_INET6) {
break;
}
}
int sfd = socket(rp->ai_family, SOCK_STREAM, 0);
if (sfd < 0) {
cerr << "socket " << sfd << endl;;
return 1;
}
ret = connect(sfd, rp->ai_addr, rp->ai_addrlen);
if (ret == -1) {
cerr << "connect " << ret << endl;
close(sfd);
return 1;
}
const char *httpgetroot = "GET / HTTP/1.1\r\n\r\n";
write(sfd, httpgetroot, strlen(httpgetroot));
char buf[128];
size_t nread;
nread = read(sfd, buf, sizeof(buf));
cout << "Received: " << nread << " bytes" << endl;
cout << buf << endl;
close(sfd);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment