如何找到客户端正在从tcp缓冲区中读取

时间:2017-10-23 17:36:00

标签: sockets go tcp

我开始在一段时间内使用golang进行项目。在我的项目中,我必须实现响应tcp客户端的tcp服务器。服务器必须向客户端发送许多消息。 问题是当服务器将消息写入客户端连接时,它必须等到客户端从缓冲区读取该消息然后发送另一条消息(服务器必须等到客户端调用reader.ReadString('\n')方法)。

在我写的服务器代码中:

for {
    data := <-client.outgoing
    client.writer.WriteString(data + "\n")
    client.writer.Flush()
}

但服务器将所有消息发送到客户端,而不等待客户端中的ReadString。

如何使服务器等到客户端读取消息然后发送其他消息?

1 个答案:

答案 0 :(得分:0)

我认为作业不明确,或者你误解并解决the XY problem

简短的回答是您永远无法知道客户端是否仅通过查看TCP会话来阅读消息。您必须在应用程序中实现此“协议”。

以下是一些问题:

  1. 从您的应用程序中,您 无法访问TCP正在执行的操作。您将获得可以执行I / O的流。

    • 对您的流的写入“成功”这一事实仅意味着TCP已同意尝试传输您的内容并具有独立副本。它没有说明数据是否已收到,甚至没有说明数据是否已被发送
    • 您可能会发现某些机制可以查看TCP的内部工作(例如ioctl s,SIOCINQSIOCOUTQ或各种setsockopts):这些无法帮助
  2. 即使您发现TCP正在做什么,这只会告诉您远程TCP正在做什么。因此,如果您可以完全控制TCP,甚至可以看到来自同行的确认,那么您仍然不知道应用程序正在做什么。应用程序很可能还没有读取数据(它可能没有请求数据,TCP可能会因为一些奇怪的原因而将其隐藏在缓冲区中,调度程序可能没有安排远程进程等。)

  3. 回到你的问题,一种真正了解远程应用程序是否收到你的消息的方法是让远程应用程序告诉你。这意味着您必须将协议重组为:

    1. 从服务器发送内容
    2. 等待来自应用程序的消息,告诉您收到了您的内容
    3. 发送更多内容(因为从第2点开始就知道这样做是安全的)