tcp client socket bind problem

N

natambu

I have a linux box with multiple ip addresses. I want to make my
python client connect from one of the ip addresses. Here is my code,
no matter what valid information I put in the bind it always comes
from the default ip address on the server. Am I doing something wrong?


-------------
#!/usr/bin/python

import socket

host = "server"
port = 1190

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.bind(("<ipalias>",0))
sock.connect((host, port))
-------------
 
M

Marc Christiansen

I have a linux box with multiple ip addresses. I want to make my
python client connect from one of the ip addresses. Here is my code,
no matter what valid information I put in the bind it always comes
from the default ip address on the server. Am I doing something wrong?

-------------
#!/usr/bin/python

import socket

host = "server"
port = 1190

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.bind(("<ipalias>",0))
sock.connect((host, port))
-------------

Looks good to me. Just to verify it, I added 127.1.2.3 as an address to
lo (ip addr add 127.1.2.3/8 dev lo broadcast 127.255.255.255), and...

In another shell:
tolot:~> lsof -c python -a -i -nP
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
[...]
python 1287 tolot 3u IPv4 3553610 TCP 127.1.2.3:38329->127.0.0.1:80 (ESTABLISHED)

Looks correct. This is using Linux 2.6.23. So, if you're doing something
wrong, it's nothing obvious to me.

Marc
 
C

castironpi

I have a linux box with multiple ip addresses. I want to make my
python client connect from one of the ip addresses. Here is my code,
no matter what valid information I put in the bind it always comes
from the default ip address on the server. Am I doing something wrong?
import socket
host = "server"
port = 1190
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("<ipalias>",0))
sock.connect((host, port))
-------------

Looks good to me. Just to verify it, I added 127.1.2.3 as an address to
lo (ip addr add 127.1.2.3/8 dev lo broadcast 127.255.255.255), and...

 >>> import socket
 >>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 >>> sock.bind(("127.1.2.3",0))
 >>> sock.connect(("127.0.0.1",80))

In another shell:
tolot:~> lsof -c python -a -i -nP
COMMAND  PID  USER   FD   TYPE  DEVICE SIZE NODE NAME
[...]
python  1287 tolot    3u  IPv4 3553610       TCP 127.1.2.3:38329->127.0.0.1:80 (ESTABLISHED)

help string:
Bind the socket to a local address. For IP sockets, the address is a
pair (host, port); the host must refer to the local host.

docs:
Bind the socket to address.

Wikipedia:
Before a socket may accept incoming connections, it must be bound.

PHP.net:
Binds the name given in address to the socket described by socket .
This has to be done before a connection is be established using
socket_connect() or socket_listen().
This function must be used on the socket before socket_connect().
 
T

Tim Roberts

...

help string:
Bind the socket to a local address. For IP sockets, the address is a
pair (host, port); the host must refer to the local host.

docs:
Bind the socket to address.

Wikipedia:
Before a socket may accept incoming connections, it must be bound.

PHP.net:
Binds the name given in address to the socket described by socket .
This has to be done before a connection is be established using
socket_connect() or socket_listen().
This function must be used on the socket before socket_connect().

That's all true. So what was your point? How does this help the original
poster?
 
C

castironpi

That's all true.  So what was your point?  How does this help the original
poster?

Confidence-- a second opinion of what the docs say. Then, something
of a criticism of the docs.
 
D

Dan Stromberg

I have a linux box with multiple ip addresses. I want to make my python
client connect from one of the ip addresses. Here is my code, no matter
what valid information I put in the bind it always comes from the
default ip address on the server. Am I doing something wrong?


-------------
#!/usr/bin/python

import socket

host = "server"
port = 1190

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.bind(("<ipalias>",0))
sock.connect((host, port))
-------------

I'd've expected that to work.

What does your routing table look like? You can view it with "netstat -
nr". I believe when a Linux network interface is ifconfig'd, the kernel
will add a route for that interface based on the netmask in the ifconfig,
but you could conceivably have another route that is broader overriding
the specific route.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top