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.