tags:

views:

103

answers:

2

Hi,

I'm having trouble figuring this out - I'm working with sockets in C using this guide - http://binarii.com/files/papers/c_sockets.txt

I'm trying to automatically get my ip and port using:

server.sin_port = 0;              /* bind() will choose a random port*/
server.sin_addr.s_addr = INADDR_ANY;  /* puts server's IP automatically */
...
...
bind(int fd, struct sockaddr *my_addr,int addrlen); // Bind function

After a successful bind, how do I find out what IP and Port I'm actually assigned?

Thanks!

+1  A: 

If it's a server socket, you should call listen() on your socket, and then getsockname() to find the port number on which it is listening:

struct sockaddr_in sin;
socklen_t len = sizeof(sin);
if (getsockname(sock, (struct sockaddr *)&sin, &len) == -1)
    perror("getsockname");
else
    printf("port number %d\n", ntohs(sin.sin_port));

As for the IP address, if you use INADDR_ANY then the server socket can accept connections to any of the machine's IP addresses and the server socket itself does not have a specific IP address. For example if your machine has two IP addresses then you might get two incoming connections on this server socket, each with a different local IP address. You can use getsockname() on the socket for a specific connection (which you get from accept()) in order to find out which local IP address is being used on that connection.

mark4o
Thanks mark4o - That works great! But I'm still having trouble getting the address - I still get 0.0.0.0 - any ideas? Thanks!
stringo0
The server socket does not have a specific IP address, and the machine may have multiple IP addresses. If you just want to get one of the machine's addresses, check out this other question: http://stackoverflow.com/questions/212528/linux-c-get-the-ip-address-of-local-computer
mark4o
Thanks - gethostname did the trick :)
stringo0
A: 

The comment in your code is wrong. INADDR_ANY doesn't 'put server's IP automatically'. It essentially puts 0.0.0.0, for the reasons explained in mark4o's answer.

EJP
Makes a lot of sense now. Thanks!
stringo0