【问题标题】:Debugging a Socket Program调试套接字程序
【发布时间】:2017-04-11 14:42:57
【问题描述】:

我目前正在使用 C 语言编写文件服务器。

当客户端向服务器请求文件时,它会写入一个套接字。然后服务器写回带有标题的数据。客户端读取标头,然后读取实际数据。在调试客户端时,服务器在客户端有机会读取数据之前终止连接。

为了解决这个问题,我编写了代码,在客户端完成后将一个字节 0 写入服务器。服务器最终读取套接字,寻找那个字节,但是当客户端在调试器下运行时,它不会等待服务器上的读取。

通过服务器上的以下调用创建套接字:
int socketId = socket(AF_INET, SOCK_STREAM, 0);

我该怎么办?

【问题讨论】:

  • 您是否尝试在服务器套接字上添加读取超时?这样它会等待一段时间让客户端发送 0 字节。
  • @KellyS.French 如果您不设置读取超时,它将永远等待。您的建议的要点不清楚。
  • EJP,据我了解,如果您不设置读取超时,它将永远等待。但是,它没有。
  • 它会等到数据到达。 Ergo, 如果它没有等待,数据已到达,或流结束,或错误。没有其他可能。我建议您忽略代码中的流结束和/或错误。发布它。
  • EJP 或其他任何人,我正在使用此套接字进行双向通信。也就是说,服务器和客户端都在套接字上读写。如果服务器正在执行写入然后执行读取,我假设它不会读取它刚刚写入的数据。我希望它读取从客户端发送的数据。我有这个权利吗?谢谢,鲍勃

标签: c sockets network-programming


【解决方案1】:

编写客户端-服务器代码存在许多挑战。在这种情况下,您也在编写协议,但可能没有意识到这一点。您的协议需要以一种明确的方式来定义通信的每一方的期望,并且场景是不平凡的。

以下是一些相关问题:
(java)basic java socket programming problem
(c)Socket Programming Problem
(c)Socket Programming -- recv() is not receiving data correctly

【讨论】:

    【解决方案2】:

    如果文件包含一个字节 0 怎么办?

    你不需要这个。只需关闭套接字。如果对等方收到一个干净的关闭,它一定已经收到了整个文件。

    听起来您在未发布的代码中没有错误检查。

    【讨论】:

      【解决方案3】:

      我们昨天发现了问题。由于变量被声明为错误类型,客户端写入的字节数多于服务器读取的字节数。感谢您的回复。

      鲍勃

      【讨论】:

        猜你喜欢
        • 2013-02-10
        • 1970-01-01
        • 1970-01-01
        • 2017-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多