Subject: getaddrinfo

From: "Chirag H. Shroff" <[email-masked]>
Date: Fri, 2 Aug 2002 11:24:48 -0700 (MST)

The following is an example from R Stevens book "UNP". I am having difficulties
with the code shown below. 

When I try to compile it using......

	gcc tcp_connect.c -lsocket -lnsl -lresolv -lc

I get the following error messages....
		
baja{shroff}% gcc tcp_connect.c -lsocket -lnsl -lresolv -lc
tcp_connect.c: In function `tcp_connect':
tcp_connect.c:38: storage size of `hints' isn't known
tcp_connect.c:40: sizeof applied to an incomplete type
tcp_connect.c:53: dereferencing pointer to incomplete type
tcp_connect.c:53: dereferencing pointer to incomplete type
tcp_connect.c:53: dereferencing pointer to incomplete type
tcp_connect.c:56: dereferencing pointer to incomplete type
tcp_connect.c:56: dereferencing pointer to incomplete type
tcp_connect.c:61: dereferencing pointer to incomplete type

I think these errors are due to the use of getaddrinfo. I am very new to socket
programming. I'll be greatful if someone can tell me where i am going wrong.

Thanks a lot,

Chirag

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <time.h>
#include <fcntl.h>
#include <errno.h>

//#include "addrinfo.h"

#define ERROR -1
#define OK     1 
#define TRUE   1

/********************************************************************************
* tcp_connect - client task
*
*
* RETURNS: OK or ERROR
*/

int tcp_connect (const char *host, const char *serv) {

    int sockfd, n;
    struct addrinfo     hints, *res, *ressave;

    bzero (&hints, sizeof (struct addrinfo));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;

    if ((n = getaddrinfo (host, serv, &hints, &res)) != 0) {
      printf ("tcp_connect error for %s, %s: %s\n\n",host,serv,gai_strerror(n));      return ERROR;
    }

    ressave = res;

    do {

        if((sockfd=socket (res->ai_family,res->ai_socktype,res->ai_protocol))<0)            continue;

        if (connect (sockfd, res->ai_addr, res->ai_addrlen) == 0)
            break;              // connected.

        close (sockfd); // connect was not successful, so ignore this socket.

    } while ((res = res->ai_next) != NULL);

    if (res == NULL) {          // connection could not be established.
        printf ("tcp_connect error for %s, %s", host,serv);
        return ERROR;
    }

    freeaddrinfo (ressave);

    return (sockfd);
}

int main () {
 
    tcp_connect ("140.252.7.10", "daytime");

    exit (0);
}

--------------------------------------------------------------------
IETF IPng Working Group Mailing List
IPng Home Page:                      http://playground.sun.com/ipng
FTP archive:                      ftp://playground.sun.com/pub/ipng
Direct all administrative requests to [email-masked]
--------------------------------------------------------------------

---

From: [email-masked]
Date: Sat, 03 Aug 2002 07:48:47 +0900

>with the code shown below. 

	the book has more than a couple of errors in IPv6 section, so be
	warned...

>tcp_connect.c: In function `tcp_connect':

	i guess you are using Solaris, but which version?
	#include <netdb.h> should be enough for pulling defs for struct
	addrinfo.

itojun