Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to bind and listen to one IP address with TCP/IP sockets? (Linux/C)

I have always used:

serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

which means that I will accept connections from any interface. If I replace the INADDR_ANY with “192.168.0.1”. Does this mean I will only accept connections from the IP address of 192.168.0.1, or does it mean I will accept connections from the interface of 192.168.0.1 resides on?

I have a situation now where I have multiple clients (each with a unique IP address but same port number), trying to connect to one server. Can I have multiple listens functions (separate threads) listening to a unique IP address and port? Or do I have to accept any connection and get the network information after I've connected?


Edit To give more clarification.

If I say serv_addr.sin_addr.s_addr = inet_addr("192.168.0.1") and a client with IP address 192.168.0.2 tries to connect, will the listen command reject this?

like image 434
Dennis Miller Avatar asked Oct 18 '11 17:10

Dennis Miller


People also ask

Can you bind and connect the same socket?

Yes, you can. Indeed there's a reason to do that: In case your routing policy makes your connection to be established from an IP address which is not the one you want to use, you can force in a multihomed/routing host a specific IP address as source by means of bind(2) system call.

Can multiple processes listen on the same socket?

The short answer is “no, not on the same host."

Can multiple sockets bind to same port?

No. Only one application can bind to a port at a time, and behavior if the bind is forced is indeterminate. With multicast sockets -- which sound like nowhere near what you want -- more than one application can bind to a port as long as SO_REUSEADDR is set in each socket's options.


1 Answers

The bind address is the local address to listen on; you can specify the address of a local interface.

If you want to control who can connect, you can either inspect the peer address inside the select/accept loop, or limit inbound connections using iptables.

Update

If I say serv_addr.sin_addr.s_addr = inet_addr("192.168.0.1") and a client with IP address 192.168.0.2 tries to connect, will the listen command reject this? I want to be able to have multiple thread, each servicing a unique IP address.

No, the address is an address on a local machine. Given that you're going for a multi-threaded design, I'd recommend you run the listen/accept code in one thread, check the client address, decide what worker thread is appropriate, and then spawn it.

At the risk of showing my age, I still prefer using listen/accept/select for most socket code - it's a personal taste thing, and yes, does influence the design when it comes to blocking/non-blocking IO, buffering, etc.

like image 173
Phil Lello Avatar answered Oct 20 '22 11:10

Phil Lello