1825771 Members
2274 Online
109687 Solutions
New Discussion

Problem with AF_INET

 
Andreas Tsamis
Advisor

Problem with AF_INET

I have the following piece of code. I run it on an hpux itanium. Its a part of a server client application. The problem is that sa_family doesnt return that is AF_INET. If i do an inet_ntop with AF_INET instead of running sock_ntop i get the correct port but 0.0.0.0 for an address


char *sock_ntop(const struct sockaddr *sa, socklen_t salen)
{
char portstr[7];
static char str[128];
switch (sa->sa_family) {
case AF_INET: {
struct sockaddr_in *sin = struct sockaddr_in *) sa;
if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL)
return(NULL);
if (ntohs(sin->sin_port) != 0) {
snprintf(portstr,
sizeof(portstr),
".%d",
ntohs(sin->sin_port));
strcat(str, portstr);
}
return(str);
}
/* end sock_ntop */

#ifdef IPV6
case AF_INET6: {
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa;

if (inet_ntop(AF_INET6, &sin6->sin6_addr, str, sizeof(str)) == NULL)
return(NULL);
if (ntohs(sin6->sin6_port) != 0) {
snprintf(portstr, sizeof(portstr), ".%d", ntohs(sin6->sin6_port));
strcat(str, portstr);
}
return(str);
}
#endif

default:
snprintf(str, sizeof(str), "unknown AF_xxx: %d, len %d", sa->sa_family, salen);
return(str);
}
return (NULL);
}

char* sockfd_to_char(int sockfd)
{
int len;
int saf;
char tc[100];
struct sockaddr_in peeraddr, myaddr;

len = 128;
getpeername(sockfd, (struct sockaddr *)&peeraddr, &len);
getsockname(sockfd, (struct sockaddr *)&myaddr, &len);

sprintf(tc,"%s\n",sock_ntop((struct sockaddr *) &myaddr, len));
return (tc);
}

Thanks Andreas