keont
keont

Reputation: 673

How to find out IP address of a given process connected through TCP

So I want to obtain the address of the machine a process (subscriber) is working on, so I can send it in a message to the server (intermediary), next to a specific port, so the server can answer on that other port.

That is, they are going to be connected, but I want the answer in another port. So I want to forward the port next to the address of the suscriber so the server can connect.

I believe ONE way of doing it would be similar to an example found

http://beej.us/guide/bgnet/output/html/multipage/getaddrinfoman.html

so I would use getaddrinfo to do something like this

if ((rv = getaddrinfo(NULL, "3490", &hints, &servinfo)) != 0) {

and then I would look in the linked list for the address in dir_tcp_srv.sin_addr.s_addr

But I think this is in fact not the correct use. I don't fully understand but I believe this is not quite the way of doing it.

I guess there are many ways of doing this but essentially I want to obtain the data (I already have the port number) so that the client and server roles switch, and the server makes a connection to the client

Edit: Ok so I'm reading time and time again how the server knows the address of the client once it's connected. I'm re-reading man pages to know how to obtain that info but can't find it yet.

Also, I found this:

https://suite.io/guy-lecky-thompson/7sd21g

But I can't say I quite get it.

Edit2: I think I've had a concept wrong for a long time.

In my code I make accept like this:

fdSocketDevuelto = accept(sock_tcp, (struct sockaddr )&dir_tcp_srv, (socklen_t) &sizeSock);

Which I now believe is overwriting the info previously stored in the struct, that I used to bind, listen, all that, with the client's info. If someone can confirm this I can comment to my own question with this as the answer or delete the whole thing since it was something I never fully understood/used.

Upvotes: 0

Views: 1146

Answers (1)

Prabhu
Prabhu

Reputation: 3541

I understand the question as you are wanting to have server find the client's IP address and Port. Take a look at getpeername():

From Beej's guide:

http://beej.us/guide/bgnet/output/html/multipage/getpeernameman.html

// assume s is a connected socket

socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
int port;

len = sizeof addr;
getpeername(s, (struct sockaddr*)&addr, &len);

// deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
    struct sockaddr_in *s = (struct sockaddr_in *)&addr;
    port = ntohs(s->sin_port);
    inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
    struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
    port = ntohs(s->sin6_port);
    inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}

printf("Peer IP address: %s\n", ipstr);
printf("Peer port      : %d\n", port);

Upvotes: 2

Related Questions