我是个服务生。我正在从套接字中读取数据。我从套接字中读到了一些让我想要放弃连接的坏消息,但我不想丢失“已经在管道中”的传入数据。我需要告诉发送者停止发送,因为我即将放弃连接,当我关闭插座时,他在电线上放的任何东西都会丢失。
我做什么好?我会发布shutdown(socket, SHUT_RD)吗?如果我这样做了,这会告诉发送者停止发送,但允许我继续读取套接字,直到所有的数据被耗尽?
应用程序应该永远不会丢失数据。
服务器是用Java编写的,我不是开发人员。我正在向他提出建议,以便我寄给他的数据永远不会丢失。我正在开发客户机(Node.js),它对套接字API没有很好的控制。
我不得不手工编写HTTP管道,因为Node.js没有这样做。客户端就是在这里继续发送HTTP的,而不是在发送下一个请求之前等待响应。客户端发送大约30k QPS。
我有一个方案,在FIFO队列中将请求排队,然后在响应返回时删除它们。如果连接中断,我会重播任何未被确认的请求,但是这最终也会播放“坏”请求,而连接只是一次又一次地被删除,一次又一次。
我似乎记得读到了一些以以下内容开头的东西:
那些试图重写TCP的人注定要失败.
因此,我想我应该放弃我复杂的系统,看看TCP是否能满足我的需要。这都是Linux环境。
Java开发人员正在使用Nginx对他的应用程序进行正面处理,Nginx是在没有关闭连接的情况下丢弃连接的,只是很难关闭连接。
无论如何,关键是,为了使我的客户端容错,我想要负责最小化数据丢失,不管另一端做什么。保持一个未加加请求的队列并在必要时重放它们是可行的,但它并不像看起来那么简单(请注意“重播坏事务”问题,我没有预料到这个问题,它还会导致双重数据,在这种情况下是可以的,但在一般情况下可能不是这样)。
服务器终止连接还有其他原因。它会时不时地这样做,让客户端进行DNS查找(他们可能想要动态更改服务器的ip地址),或者可能只是出现了网络故障,破坏了连接。
发布于 2015-05-19 04:52:36
我是个服务生。我正在从套接字中读取数据。我从套接字中读到了一些让我想要放弃连接的坏消息,但我不想丢失“已经在管道中”的传入数据。
为什么不行?你读过“不好的东西”:是什么让你觉得事后有什么好的?或者你可以正确地重新同步到它?在跳过一些未知数目的错误字节以到达下一条消息的开始后?
我需要告诉发送者停止发送,因为我即将放弃连接,当我关闭插座时,他在电线上放的任何东西都会丢失。我会发布
shutdown(socket, SHUT_RD)吗?如果我这么做了,这会告诉发件人停止发送
这是高度依赖于平台的,取决于服务器平台:
但是,请允许我继续读取套接字,直到所有数据都耗尽为止?
它可能允许或不允许您读取所有已经到达的数据。例如,Windows会在关机后立即为您提供一个SocketException: Socket input is shutdown。在发布关机时,您不应该收到任何正在运行的数据。
奇怪的要求。我就不接了。
https://stackoverflow.com/questions/30316618
复制相似问题