Hello, I am starting socket scripting with python. I do understand from the doc that a socket is bmocking by default. I wrote 2 basics script to verify this behaviour.
my "tcp_server.py": import socket, sys s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) HOST = '192.168.0.103' PORT = 1060 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT)) while True: s.listen(1) print 'Listening at', s.getsockname() sc, sockname = s.accept() print 'We have accepted a connection from', sockname print 'Socket connects', sc.getsockname(), 'and', sc.getpeername() while True: data = sc.recv(1024) if data: print 'Got from client:', repr(data) data = '' else: #raise EOFError('socket closed') print 'socket closed by remote client' sc.close() sys.exit() and my "tcp_client.py" import socket, sys, time s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) HOST = '192.168.0.103' PORT = 1060 s.connect((HOST, PORT)) print 'Client has been assigned socket name', s.getsockname() while True: data = raw_input('cmd:') if (data == '\x05'): print 'closing socket and exit' s.close() sys.exit() s.sendall(data) When both are running everything what I type in the client is received by the server. When nothing is sent from the client the server is waiting (socket is blocking) for next datas. If I close the client with Ctrl-E (or a kill) the socket on the server is getting a null value and the server exit. So everything is fine. And everything is clear in my mind. The problem I have now is the following. I have a script to connect to some telecom service. The script is forking (parent/child) The child is only reading what comes from the remote server. Here the problematic code: total = '' while True: data = s.recv(1024) total += data if (data == ''): print 'remote site is closed' s.close() sys.exit() What is happening is that I got some datas from the remote site, Something like 'Contacting BH: ...' But directly followed by 'remote site is closed. And if I remove the 2 lines (s.close;sys.exit) my script is looping So it means data=='' This makes no sense at all. Why is the socket not waiting for the next datas flow ?? Why is the socket not blocking ? With Perl I just have to write: while (sysread($socket,$data,1024)){ syswrite(STDOUT,$data) } And it works perfectly. Any hint about what I missed in Python ? kr, Arthur. -- https://mail.python.org/mailman/listinfo/python-list