I wrote a client-server python program where the client sends a list to the server, the server receives the array, deletes the first two elements of the list and sends it back to the client.
There is no problem with the server receiving the list. But when the server wants to send back the edited list, it is showing error:
socket.error: [Errno 32] Broken pipe
.
The client.py and the server.py are running from different machines with different ip. I'm posting the code for the client.py and server.py below:
Client.py
import socket, pickle
HOST = '192.168.30.218'
PORT = 50010
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
arr = ['CS','UserMgmt','AddUser','Arnab','Password']
data_string = pickle.dumps(arr)
s.send(data_string)
data = s.recv(4096)
data_arr1 = pickle.loads(data)
s.close()
print 'Received', repr(data_arr1)
print data_arr1;
Server.py:
import socket, pickle;
HOST = '127.0.0.1';
PORT = 50010;
s= socket.socket(socket.AF_INET, socket.SOCK_STREAM);
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1);
s.bind(('',PORT));
s.listen(1);
conn, addr = s.accept();
print 'Connected by' , addr;
data_addr = list();
while 1:
data = conn.recv(4096);
if not data: break;
data_addr = pickle.loads(data);
print 'Received Data', repr(data_addr);
print data_addr;
data_addr.pop(0);
data_addr.pop(0);
print data_addr;
data_string1 = pickle.dumps(data_addr);
s.send(data_string1);
break;
conn.close();
socket.shutdown();
socket.close();
The entire error msg is:
Traceback (most recent call last):
File "server.py", line 22, in <module>
s.send(data_string1);
socket.error: [Errno 32] Broken pipe
How do I fix this problem so that the client can receive the edited list from the server without any error ? Thank You in advance.
From what we've just read, we know that [Errno 32] Broken pipe is caused by the system sending SIGPIPE signal, which is an inter-process communication mechanism of Linux. For example, SIGINT is another signal used internally by Linux system.
Properly catching IOError to avoid Broken pipe error As a Broken pipe error is an IOError error, we can place a try/catch block in order to catch it, as shown in the following snippet of code: Syntax: import sys, errno.
This error generally means means that the data stopped flowing to us and we were unable to start the transfer again. Often times this is caused by a wireless internet connection with fluctuating signal strength, a firewall or other security software.
In simple term, Broken Pipe means that a machine is attempting to read or write data from/to a pipe, while the machine on other end of the pipe has died or been terminated. Now, since the connection is closed, new connection should be established for further transfer of data, or else the data transfer ceases.
You made a small mistake:
s.send(data_string1);
Should be:
conn.send(data_string1);
Also the following lines need to be changed:
socket.shutdown();
to s.shutdown();
And:
socket.close();
to s.close();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With