Solved

socket and server ip address

Posted on 2013-11-11
3
348 Views
Last Modified: 2013-11-11
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
Comment
Question by:perlperl
3 Comments
 
LVL 86

Expert Comment

by:jkr
ID: 39639760
'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
 

Accepted Solution

by:
perlperl earned 0 total points
ID: 39639807
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

Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Introduction This article is a continuation of the C/C++ Visual Studio Express debugger series. Part 1 provided a quick start guide in using the debugger. Part 2 focused on additional topics in breakpoints. As your assignments become a little more …
The article explains the protocols and technology which is involved when two computers on different TCP/IP networks communicate with each other. In the diagram, a router is used to segregate two networks. The networks are 192.168.1.0/24 and 192…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use nested-loops in the C programming language.
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…

813 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

8 Experts available now in Live!

Get 1:1 Help Now