Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 370
  • Last Modified:

socket and server ip address

I am creating and binding a socket on my server with the following optons on a clustered environment

	struct addrinfo hints, *start, *results;
	bzero(&hints, sizeof(struct addrinfo));
	hints.ai_flags = AI_PASSIVE; // Use address return by getaddrinfo in bind() return addrinfo will have INADDR_ANY set to IPv4 adress and INADDR6_ANY_INIT for IPv6 address
	hints.ai_family = AF_UNSPEC;  // return both the family AF_INET and AF_INET6 address structures
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_protocol = IPPROTO_TCP;

getaddrinfo(NULL, "4455", &hints, &results);
int fd = socket(results->ai_family, results->ai_socktype, results->ai_protocol);
bind(fd, results->ai_addr, results->ai_addrlen);

Open in new window


The above server is running in background and continously listening for incoming packets.

Once I accept a new request I want to make sure that the client's request came on specific server's IP address only.

I tried two options to get server's IP:

METHOD 1  ---> This prints  Addres = 0.0.0.0
// I believe this is because I have AI_PASSIVE set. 
	struct sockaddr_storage addr;
	len = sizeof (struct sockaddr_storage);
	 getsockname(fd, (struct sockaddr*)&addr, &len );
	struct sockaddr_in *sin = (struct sockaddr_in *)&addr;
	char str[INET_ADDRSTRLEN];
	inet_ntop(AF_INET, &sin->sin_addr, str, INET_ADDRSTRLEN);
	DBG0(" Addres = " << str);    

METHOD 2:  --> This prints  Adress =127.0.0.1
In this method, instead of using "fd", I am using the socket descriptor from "accept" call

Open in new window


0.0.0.0 and 127.0.01 does not help me as client may have initiated a request againt server's ip address say 10.10.20.20
How do I get the specific IP address from either "fd" or "file descriptor from returned accept call"  so that I can make a check that client sent request on this IP only.
0
perlperl
Asked:
perlperl
1 Solution
 
jkrCommented:
'getsockname()' returns your local connection information. If you want the remote info, use 'getpeername()' (https://www.linux.com/learn/docs/man/3178-getpeername2) instead:

	struct sockaddr_storage addr;
	len = sizeof (struct sockaddr_storage);
	 getpeername(fd, (struct sockaddr*)&addr, &len ); // <---- !
	struct sockaddr_in *sin = (struct sockaddr_in *)&addr;
	char str[INET_ADDRSTRLEN];
	inet_ntop(AF_INET, &sin->sin_addr, str, INET_ADDRSTRLEN);
	DBG0(" Addres = " << str);    

Open in new window

0
 
perlperlAuthor Commented:
I wanted local connection only not the peer name.

Can I close this Q please, there was a bug in my code ;) and I fixed it. I did not specify the address properly
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now