【发布时间】:2012-09-16 03:48:44
【问题描述】:
我在 c 中实现了一个代理,并且正在使用 select() 来不阻塞 I/O。有多个客户端连接到代理,因此我在消息中包含套接字描述符 # 以便我知道将来自服务器的回复消息转发到哪个套接字。
但是,有时 read() 将无法接收到空字符之前的完整消息,但会在下一轮 select() 中发送剩余的消息。我想立即收到完整的消息,以便知道将回复转发到哪个套接字(缓冲不起作用,因为当有多个客户端时,我不知道哪个消息属于哪个)。有没有办法在等待空字符到达时不阻塞读取?
【问题讨论】:
-
非阻塞读取就是这样——不会阻塞的读取。它不能保证整个消息一次都在那里。如果您想从输入逐步构建整个消息,则必须使用缓冲区。
-
此外,您不需要在消息中包含套接字描述符......这听起来像是一个相当糟糕的设计。
-
考虑拥有一个结构列表,而不是拥有一个套接字描述符列表,这个结构包含套接字描述符和一个要写入的缓冲区。然后,您可以更轻松地跟踪缓冲区是否已满,或者您对每个连接的套接字都有完整的消息。
-
感谢您的回复。但是,当我收到来自服务器的消息时,如果它不是完整的消息,我如何知道将其转发给哪个客户端?即使在 struct 的情况下,我怎么知道要在哪个缓冲区插入消息?
-
你知道它来自哪个套接字。该套接字对该客户端是唯一的。