【问题标题】:Client socket sends but Silent Server socket doesn't recieve客户端套接字发送但静默服务器套接字不接收
【发布时间】:2012-06-12 14:51:10
【问题描述】:

我有一个客户端套接字,它在连接握手完成后将图像数据推送到服务器套接字。并且服务器套接字处理它们没有任何响应

几分钟后效果很好。但是一段时间后,服务器套接字停止获取这些数据。我不知道为什么? TCP 中有没有这样的事情,比如如果客户端不断推送数据,服务器必须说些什么,否则对话就会停止?

我多年前编写了这段代码。为了让它工作,我让服务器返回一个字符串“ACK”响应。但是,如果我将其更改为任何字符串,它将起作用。

但现在我想弄清楚为什么要重建程序。

【问题讨论】:

    标签: qt sockets tcp serversocket tcpsocket


    【解决方案1】:

    与 TCP 的“单向”通信完全没问题,除非您需要发送方的接收方确认。但那是您的应用程序级协议。在传输级别,数据包仍然双向流动——TCP 在两个方向上保持序列号并向另一端确认它们。这允许检测丢弃/重复的数据包并重新传输,从而提供流的可靠性。在连接握手期间协商并在对话期间更新的窗口大小允许 TCP 减慢快速发送方的速度,而这会压倒慢速接收方。

    您真正需要做的是使用嗅探器(如tcpdump(1)wireshark)记录 TCP 连接,并找出“套接字停止获取这些数据”时线路上发生的情况。

    【讨论】:

    • 我用wireshak嗅探了流量。我看到的是客户不断发送。但几分钟后服务器没有收到任何这些数据包。
    • 您确定服务器实际上是从套接字读取的吗?服务器是否发送 TCP ACK?
    • 是的,否则它在最初的几分钟内是如何工作的。我观察到的是客户端先推送数据包,服务器处理它,它可以快速运行几分钟。在那之后,它看起来像一个流量溢出,阻塞了流量,但它应该由底层 TCP 很好地处理。然而令人惊讶的是它不是。
    • 这不是一个有用的评论。这里没有魔法。如果您继续从具有待处理数据的套接字读取,您将获得数据。再次检查您的代码 - 在收到您的图像后您是否会做任何可能会阻塞的操作?就像锁定一个互斥锁,打开另一个套接字,等待一些输入?嗅探服务器端的连接。你得到数据段吗?服务器 TCP 窗口是否接近于零?
    猜你喜欢
    • 2011-10-22
    • 2011-05-02
    • 2017-01-04
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 2014-03-10
    • 2012-12-14
    • 1970-01-01
    相关资源
    最近更新 更多