Created
February 15, 2016 06:38
-
-
Save lethee/412c5cd3bb73fd04f98f to your computer and use it in GitHub Desktop.
ipv4 ipv6 getaddrinfo instead of gethostbyname
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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