Re: newbie: socket api
 
In article <f067934f-c936-48ea-854f-5220718c5d36@googlegroups.com>,
Thomas Kaufmann  <tokauf@googlemail.com> wrote:
Here is my code:
void* InitAndConnect(int sockfd, int family, char *ip) {
 
 // I want return this struct
 struct sockaddr sa;
You should return a struct sockaddr_storage, since a plain struct
sockaddr isn't big enough for a struct sockaddr_in6. That,
or a pointer of type struct sockaddr, that points to a
_in or _in6.
 if (family == AF_INET) {
   
   try {
     
     struct sockaddr_in servaddr;;    
     
     bzero(&servaddr, sizeof(servaddr) );
     servaddr.sin_family = family;
     servaddr.sin_port   = htons(SERV_PORT);
Should probably be something like
    struct sockaddr_in *serveraddr = (struct sockaddr_in *)&sa;
    servaddr->sin_family = family;
    servaddr->sin_port   = htons(SERV_PORT);
    ... etc
 // does' work 
 return sa;
But why not use getaddrinfo() to do all the dirty work for you.
Note that you don't even have to pass in "family" since
getaddrinfo() figures that out for you.
int InitAndConnectchar *ip)
{
    struct addrinfo hints = { 0 };
    hints.ai_flags = AI_NUMERICHOST;
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    struct addrinfo *res;
    int r = getaddrinfo(ip, SERV_PORT, &hints, &res);
    if (r != 0) {
        fprintf(stderr, "%s/%s: %s\n", ip, SERV_PORT,
                gai_strerror(r));
        return NULL;
    }
    int sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    if (sock < 0)
        return -1;
    int ok = connect(sock, res->ai_addr, res->ai_addrlen);
    if (ok != 0) {
        close(sock);
        sock = -1;
    }
    freeaddrinfo(res);
    return sock;
}
Mike.