I know this question seems typical and multiple times answered but I think if you read the details it is not so common (I did not find it).
The poin
Statefull connection is uniquely identified by two end points Peer(address:port)<=>My(address:port). Both getpeername() and getsockname() are needed to get this information.
Ok. Thanks to @alk and @rileyberton I found the correct method to use, the getpeername:
int sockfd;
void main(void) {
//[...]
struct sockaddr_in clientaddr;
socklen_t clientaddr_size = sizeof(clientaddr);
int newfd = accept(sockfd, (struct sockaddr *)&clientaddr, &clientaddr_size);
//fork() and other code
foo(newfd);
//[...]
}
void foo(int newfd) {
//[...]
struct sockaddr_in addr;
socklen_t addr_size = sizeof(struct sockaddr_in);
int res = getpeername(newfd, (struct sockaddr *)&addr, &addr_size);
char *clientip = new char[20];
strcpy(clientip, inet_ntoa(addr.sin_addr));
//[...]
}
So now in a different process I can get the IP address (in the "string" clientip) of the client that originated the connection only carrying the file descriptor newfd obtained with the accept method.
You would use getsockname() (http://linux.die.net/man/2/getsockname) to get the IP of the bound socket.
Also answered before, here: C - Public IP from file descriptor