I forgot to mention that with this code: total = '' while True: data = s.recv(1024) total += data if (total != ''): print total total = '' Everything is fine. I am still looping but I get the complete data flow sent by the remote server. The data flow is not corrupted with extra characters. But I do not detect the closing of the socket on the remote server. Why is recv not blocking !!!
Le samedi 23 août 2014 10:23:14 UTC+2, Arthur Clarck a écrit : > 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