Sockets: code works locally but fails over LAN

Peter Hansen peter at engcorp.com
Wed Aug 31 15:13:39 CEST 2005


n00m wrote:
> import socket, thread
> host, port = '192.168.0.3', 1434
> s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> s2.connect((host, 1433))
> s1.bind((host, port))
> s1.listen(1)
> cn, addr = s1.accept()
> 
> def VB_SCRIPT():
>     while 1:
>         data = cn.recv(4096)
>         if not data: return
>         s2.send(data)
>         print 'VB_SCRIPT:' + data + '\n\n'
> 
> def SQL_SERVER():
>     while 1:
>         data = s2.recv(4096)
>         if not data: return
>         cn.send(data)
>         print 'SQL_SERVER:' + data + '\n\n'

Several suggestions:

1. Use repr(data) instead of just 'data' above, to see better the actual 
bytes without the possibility of control characters like \r and \b 
screwing things up.

2. I'm not at all sure that accessing the same socket object 
simultaneously from two threads is safe.  You might consider creating a 
pair of Queue objects to safely communicate the information between the 
two threads.  That, of course, poses the problem of how do you wait on 
data to arrive from the socket and from the Queue at the same time.  One 
approach is to use non-blocking sockets or timeouts, while the other is 
to use a pre-existing asynchronous framework such as, say, Twisted, and 
avoid reinventing the wheel (and making all the same mistakes that other 
programmers have made zillions of times before you).

It's also possible this is not remotely related to your problem, but I 
suspect without knowing more about SQL Server, VB, and your own setup 
I'd be guessing wildly anyway...

-Peter



More information about the Python-list mailing list