Expiring Today—Celebrate National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

socket and server ip address

Posted on 2013-11-11
3
Medium Priority
?
363 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
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

Moving data to the cloud? Find out if you’re ready

Before moving to the cloud, it is important to carefully define your db needs, plan for the migration & understand prod. environment. This wp explains how to define what you need from a cloud provider, plan for the migration & what putting a cloud solution into practice entails.

Question has a verified solution.

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

Please see preceding article here: http://www.experts-exchange.com/Networking/Operating_Systems/A_11209-Root-Bridge-Election.html Figure 1 After Root Bridge has been elected, then what?..... Let's start by defining a Root Port in la…
This is the first one of a series of articles I’ll be writing to address technical issues that are always referred to as network problems. The network boundaries have changed, therefore having an understanding of how each piece in the network  puzzl…
The goal of this video is to provide viewers with basic examples to understand and use conditional statements in the C programming language.
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

719 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