Code:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <errno.h>
#include <string.h>
#include <netinet/in.h>
extern int errno;
extern int h_errno;
#define arrsize(x) sizeof(x)/sizeof(x[0])
static struct addrinfo *pp=NULL;
static struct addrinfo **ServerSocketAddresses=&pp;//&pp;
static void print_error(const char *file, const int line, const char *func, const char *lib_fn,
const char *err_msg)
{
fprintf(stderr, "Program fails in %s:%s:%d:\n after calling of %s: %s\n",
file, func, line, lib_fn, err_msg);
exit(1);
}
#define wrap_print_error(fn, err_msg) print_error(__FILE__, __LINE__, __FUNCTION__ , fn, err_msg)
#define wrap_print_sys_error(fn) wrap_print_error(fn, strerror(errno))
#define wrap_print_net_error(fn, errc) wrap_print_error(fn, gai_strerror(errc))
static struct addrinfo *get_server_info(const char *host, const char *port)
{
int l_error;
struct addrinfo *OneSocketAddr;
/*
struct addrinfo hint;
//
hint.ai_family=AF_UNSPEC;
hint.ai_socktype=SOCK_STREAM;
hint.ai_flags=(AI_V4MAPPED | AI_ADDRCONFIG);
*/
l_error=getaddrinfo(host, port, NULL, ServerSocketAddresses);
if (l_error<0)
{
if (l_error==EAI_SYSTEM)
wrap_print_sys_error("getaddrinfo: system error: ");
else
wrap_print_net_error("getaddrinfo: ", l_error);
return NULL;
}
OneSocketAddr=*ServerSocketAddresses;
while(OneSocketAddr)
{
if ((OneSocketAddr->ai_family==AF_INET)&&(OneSocketAddr->ai_socktype==SOCK_STREAM)&&
(OneSocketAddr->ai_addr))
break;
OneSocketAddr=OneSocketAddr->ai_next;
}
if (!OneSocketAddr)
{
fprintf(stderr, "No appropriate sockets on server available\n");
return NULL;
}
return OneSocketAddr;
}
int main (const int argc, const char **argv)
{
int fd_socket=0, res=1;
struct addrinfo *server_addr;
struct sockaddr_in *dummy;//=(struct sockaddr_in *)server_addr;
//
if (argc!=3)
{
fprintf(stderr, "Usage: %s <host> <port>\n", argv[0]);
goto l_err;
}
server_addr=get_server_info(argv[1], argv[2]);
if (server_addr)
{
fprintf(stderr, "found socket with options %d\n", server_addr->ai_flags);
}
else
goto l_err; // errors already are handled
dummy=(struct sockaddr_in *)server_addr->ai_addr;
fd_socket=socket(AF_INET, SOCK_STREAM, server_addr->ai_protocol);
if (fd_socket<0)
wrap_print_sys_error("socket");
//connect
if (connect(fd_socket, server_addr->ai_addr, server_addr->ai_addrlen))
{
wrap_print_sys_error("connect");
goto l_err;
}
{
const char *data="GET www.google.com/ HTTP/1.0\n\n";//"Hello, server!";
int rc;
//
rc = write(fd_socket, data, arrsize(data)*sizeof(char));
if (rc<0)
{
wrap_print_sys_error("write");
goto l_err;
}
}
// respond
while (1)
{
char buf[32];
int rc;
//
rc=read(fd_socket, buf, arrsize(buf)-1);
if (rc<0)
{
wrap_print_sys_error("read");
goto l_err;
}
else if (rc==0) // read EOF
break;
else
{
buf[rc]='\0';
fprintf(stdout, "%s", buf);
}
}
fprintf(stdout, "\n");
res=0;
l_err:
if (fd_socket)
close(fd_socket);
if (ServerSocketAddresses)
freeaddrinfo(*ServerSocketAddresses);
return res;
}
Program was executed as a.out google.com 80