服务器 - 客户端通信

时间:2011-05-31 16:21:00

标签: c sockets

我正在编写一个网络C程序,客户端将一块数据发送到服务器,我想要 在从客户端关闭套接字之前,确保服务器已读取所有数据。我想过从服务器向客户端发送一个特殊的'ok'字符,但我想如果在服务器执行过程中出现错误 程序和服务器从他的身边关闭管道(例如,读取系统调用失败),客户端将等待读取系统调用以寻找永远不会发生的事情。关于如何解决这个问题的任何想法?

感谢, 尼科斯

6 个答案:

答案 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)

您的客户似乎有四种可能的结果:

  1. 服务器执行命令并发回'OK'。
  2. 服务器在执行命令时出现问题,而是发回错误字符串。
  3. 尝试执行命令时,服务器退出,崩溃或以其他方式消失,并且TCP连接已关闭。
  4. 服务器出错并在尝试执行命令时挂起,或者由于其他原因它从不发回任何响应(但它会保持TCP连接打开)。
  5. 前三个可以在客户端上以直接的方式处理。要处理第四个问题,你需要在客户端实现超时 - 但是当你真的服务器响应速度很慢而不是实际发生故障时,你就会冒着提前超时的风险。可能最好的办法是使超时非常慷慨(例如30秒?),并确保您的服务器可靠且不会挂起。 :)