I have a server with two different network interfaces, each with a different IP address. How can I create a socket so it'll go out a specific IP address?
I'd prefer a python example, but the question is language agnostic, so shoot away.
EDIT: Please don't give me "You can't" as an answer. I mean, it is a computer. I can do anything I like to it, for example - I can programatically disable the one interface I don't want on the fly. I'm looking for something prettier.
You can certainly bind a socket to a specific device.
I don't know how to do it in python, but using the berkeley socket api (in C) you need to call setsockopt()
, using the option SO_BINDTODEVICE
.
You pass in an interface descriptor, which is of type struct ifreq
. Ideally you would get the contents of the interface descriptor by using ioctl()
, and requesting SIOCGIFINDEX
- passing the name of the interface (eg. eth0) as an argument.
edit: Just did a quick search and found this documentation of the socket methods in python. setsockopt()
is amongst them.
Just a little note - what I really needed is to bind to a specific IP, and just for the sake of completeness, the solution is to bind the socket after creation. Source in python:
import socket
s = socket.socket()
s.bind(("127.0.0.1", 0))
s.connect(("321.12.131.432", 80))
import socket
s = socket.socket()
s.bind((get_ip_address('eth0'), 0))
from Quora