我正在编写一个网络C程序,客户端将一块数据发送到服务器,我想要 在从客户端关闭套接字之前,确保服务器已读取所有数据。我想过从服务器向客户端发送一个特殊的'ok'字符,但我想如果在服务器执行过程中出现错误 程序和服务器从他的身边关闭管道(例如,读取系统调用失败),客户端将等待读取系统调用以寻找永远不会发生的事情。关于如何解决这个问题的任何想法?
感谢, 尼科斯
答案 0 :(得分:1)
我想确保所有数据都有 在我关闭之前,服务器b * 已经读过 来自客户端的套接字 *。
如果您正在使用TCP,请考虑以下事项:一旦发送数据,即使您关闭套接字/退出程序, TCP堆栈仍将继续尽力发送。
一旦你send
/ write
数据,它就会从你手中消失。它被复制到内核缓冲区中并在稍后发送。在幕后(netinet
深处的某个地方),连接未关闭,直到所有发送的数据都已被确认/由于其他原因终止连接。
答案 1 :(得分:0)
你提出的实施对我来说听起来不错 - 如果出现错误,这是一个例外情况 - 要抓住这个,你需要在你的阅读电话上使用超时。
答案 2 :(得分:0)
在客户端中实现超时。等待来自服务器的响应的一些可配置/合理的时间。如果超过该时间段,则采取相应行动。
答案 3 :(得分:0)
alternating bit protocol是解决这个问题的一种方法。有不同的方法来实现它。
当A发送消息时,它会重新发送消息 连续地,以相同的顺序 数字,直到收到一个 来自B的确认包含 相同的序列号。当那个 发生,A补充(翻转) 序列号并开始 发送下一条消息。
答案 4 :(得分:0)
无需担心何时关闭客户端的插槽。只要数据已写入套接字,您就可以在此之后随时关闭它。 @cnicutar在他的回答中提供了一个很好的解释。
对于从服务器返回到客户端的特殊确认字符,您不必担心使用TCP。但是,您可能希望修改数据块,使其包含一个标题,指示有多少数据。例如,数据块的前4个字节可以是指示有多少字节的长度字段。服务器可以读取前4个字节,然后知道要读取多少字节。 TCP通信通常具有类似的功能。
答案 5 :(得分:0)
您的客户似乎有四种可能的结果:
前三个可以在客户端上以直接的方式处理。要处理第四个问题,你需要在客户端实现超时 - 但是当你真的服务器响应速度很慢而不是实际发生故障时,你就会冒着提前超时的风险。可能最好的办法是使超时非常慷慨(例如30秒?),并确保您的服务器可靠且不会挂起。 :)