背景
我有一个简单的套接字服务器设置,我试图允许同时连接和回显数据.客户端启动多个线程,每个线程都与服务器建立自己的连接.这适用于socket.send()调用,但所有后续调用都会导致"由对等方重置连接"或"断开管道".请注意,我没有找到切换重置和损坏管道的更改.我在这里寻找解决方案,但恐怕我可能不知道该搜索什么.
我是以错误的方式解决这个问题,还是我在设置中忽略了什么?
服务器
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
print "{} wrote: {}\n".format(self.client_address[0], self.data)
self.request.send(self.data.upper())
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)
客户
import socket
import sys
import threading
import time
HOST, PORT = "localhost", 9999
def create_client():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
cur_thread = threading.current_thread()
sock.connect((HOST, PORT))
for x in range(55):
msg = "{}: {}\n".format(cur_thread.name, str(x))
# Connect to server and send data
print cur_thread.name + ": …
Run Code Online (Sandbox Code Playgroud) 我正在使用EC2实例运行一项大型工作,我估计大约需要24小时才能完成.我得到了同样的问题,这里描述ssh断管ec2
我按照上面帖子中的建议/解决方案,在我的ssh会话shell中,我通过以下命令启动了我的python程序:
nohup python myapplication.py > myprogram.out 2>myprogram.err
Run Code Online (Sandbox Code Playgroud)
一旦我这样做,连接保持完整的时间比我不使用nohup
它的时间更长,但它最终失败broken pipe error
并且我回到原点.结果' python myapplication.py
'终止了.
有关正在发生的事情的任何想法以及我可以采取哪些措施来防止这种情况发生?
我是套接字编程的新手,我正在尝试使用send()
C++中的函数向服务器发送一些数据包,但在向服务器发送数据包时,我总是收到"Broken pipe"错误.你可以帮我解决以下几点吗?
send()
函数返回"Broken pipe"错误时?send()
函数的"Broken pipe"错误解决方案是什么?注意:我使用命名套接字在客户端和服务器之间进行通信.
我遇到过write()
在远程关闭的客户端上使用服务器端不返回0的情况.
根据男子2 write
:
成功时,返回写入的字节数(零表示没有写入).出错时,返回-1,并正确设置errno.
根据我的理解:当在远程关闭的套接字上使用read
/ 时write
,第一次尝试应该失败(因此返回0
),并且下一次尝试应该触发断开的管道.但事实并非如此.write()
就好像它在第一次尝试时成功发送数据一样,然后在下次尝试时我得到一个破损的管道.
我的问题是为什么?
我知道如何妥善处理破损的管道,这不是问题.我只是想了解为什么在这种情况下write
不会返回0
.
下面是我写的服务器代码.在客户端,我尝试了一个基本的C客户端(使用close()和shutdown()来关闭套接字)和netcat.这三个人给了我相同的结果.
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#define MY_STR "hello world!"
int start_server(int port)
{
int fd;
struct sockaddr_in sin;
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd == -1)
{
perror(NULL);
return (-1);
}
memset(&sin, 0, sizeof(struct sockaddr_in));
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_family = AF_INET;
sin.sin_port = htons(port); …
Run Code Online (Sandbox Code Playgroud) 我正在开发Android 2.2和LG Black设备的应用程序.当我在我的LG设备上运行应用程序时,我得到以下SocketException,这在其他设备上永远不会发生!
Broken pipe
java.net.SocketException: Broken pipe
at org.apache.harmony.luni.platform.OSNetworkSystem.writeSocketImpl(Native Method)
at org.apache.harmony.luni.platform.OSNetworkSystem.write(OSNetworkSystem.java:723)
at org.apache.harmony.luni.net.PlainSocketImpl.write(PlainSocketImpl.java:578)
at org.apache.harmony.luni.net.SocketOutputStream.write(SocketOutputStream.java:59)
Run Code Online (Sandbox Code Playgroud)
如何解决?谢谢.
broken-pipe ×5
sockets ×3
linux ×2
tcp ×2
amazon-ec2 ×1
android ×1
c ×1
c++ ×1
lg ×1
python ×1
send ×1
socketserver ×1
ssh ×1
unix ×1