Can't I Cast sockaddr to sockaddr_in?!

I'm trying to grab client's port number, by doing the following code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//get client's port number - here we are not dealing with pointers
//because the returned value will be passed as a parameter to htons()
//htons() takes u_short, which is similar to short, parameter
short get_client_port(struct sockaddr clientInformation)
{
	//carries the port number that client connected from
	short portNumber;
	
	//check the family version of client IP address, so you
	//can know where to cast, either to sockaddr_in or sockaddr_in6
	//and then grab the port after casting
	if (clientInformation.sa_family == AF_INET) {
		struct sockaddr_in ipv4 = (struct sockaddr_in)clientInformation;
		portNumber = ipv4.sin_port;
		return portNumber;
	}else{
		struct sockaddr_in6 ipv6 = (struct sockaddr_in6)clientInformation;
		portNumber = ipv6.sin6_port;
		return portNumber;
   	}
}


In some point i did this:

1
2
3
short portNum =  get_client_port(clientInfo);
short portHostByte = ntohs(portNum);
//put portHostByte in a printf() 


Why do i get the following errors?

1
2
3
4
5
6
7
echo_server.cpp: In function ‘short int get_client_port(sockaddr)’:
echo_server.cpp:53: error: no matching function for call to ‘sockaddr_in::sockaddr_in(sockaddr&)’
/usr/include/netinet/in.h:218: note: candidates are: sockaddr_in::sockaddr_in()
/usr/include/netinet/in.h:218: note:                 sockaddr_in::sockaddr_in(const sockaddr_in&)
echo_server.cpp:57: error: no matching function for call to ‘sockaddr_in6::sockaddr_in6(sockaddr&)’
/usr/include/netinet/in.h:232: note: candidates are: sockaddr_in6::sockaddr_in6()
/usr/include/netinet/in.h:232: note:                 sockaddr_in6::sockaddr_in6(const sockaddr_in6&)


Any idea?
I got it....Its too simple :-), i don't know how i did not get it from the first time! Being blank is not a good thing...

Here it is:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
short get_client_port(struct sockaddr *clientInformation)
{
	//carries the port number that client connected from
	short portNumber;
	
	//check the family version of client IP address, so you
	//can know where to cast, either to sockaddr_in or sockaddr_in6
	//and then grab the port after casting
	if (clientInformation->sa_family == AF_INET) {
		struct sockaddr_in *ipv4 = (struct sockaddr_in *)clientInformation;
		portNumber = ipv4->sin_port;
		return portNumber;
	}else{
		struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)clientInformation;
		portNumber = ipv6->sin6_port;
		return portNumber;
   	}
}
Topic archived. No new replies allowed.