【问题标题】:c select() reading until null characterc select() 读取直到空字符
【发布时间】:2012-09-16 03:48:44
【问题描述】:

我在 c 中实现了一个代理,并且正在使用 select() 来不阻塞 I/O。有多个客户端连接到代理,因此我在消息中包含套接字描述符 # 以便我知道将来自服务器的回复消息转发到哪个套接字。

但是,有时 read() 将无法接收到空字符之前的完整消息,但会在下一轮 select() 中发送剩余的消息。我想立即收到完整的消息,以便知道将回复转发到哪个套接字(缓冲不起作用,因为当有多个客户端时,我不知道哪个消息属于哪个)。有没有办法在等待空字符到达时不阻塞读取?

【问题讨论】:

  • 非阻塞读取就是这样——不会阻塞的读取。它不能保证整个消息一次都在那里。如果您想从输入逐步构建整个消息,则必须使用缓冲区。
  • 此外,您不需要在消息中包含套接字描述符......这听起来像是一个相当糟糕的设计。
  • 考虑拥有一个结构列表,而不是拥有一个套接字描述符列表,这个结构包含套接字描述符一个要写入的缓冲区。然后,您可以更轻松地跟踪缓冲区是否已满,或者您对每个连接的套接字都有完整的消息。
  • 感谢您的回复。但是,当我收到来自服务器的消息时,如果它不是完整的消息,我如何知道将其转发给哪个客户端?即使在 struct 的情况下,我怎么知道要在哪个缓冲区插入消息?
  • 你知道它来自哪个套接字。该套接字对该客户端是唯一的。

标签: c sockets proxy


【解决方案1】:

TCP 中没有消息这样的东西。它是一个字节流协议。你写字节,它发送字节,你读字节。无法保证您在任何时候都会收到多少字节,并且无法保证单次写入写入的数据量与单次读取读取的数据量之间的关联。如果你想要消息,你必须自己实现它们。任何给定的读取都可以读取零个、一个或多个字节,直到缓冲区的长度。这可能是半个消息。可能是一条半消息。它是什么完全取决于你。

【讨论】:

    【解决方案2】:

    如果您正在处理单个消息,请使用 ZeroMQ。它具有大量语言的绑定,并且是网络的一个很好的抽象。事实上,它可以为你处理这个代理模型。

    【讨论】:

      猜你喜欢
      • 2021-02-23
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      相关资源
      最近更新 更多