我在 c 中实现了一个代理,并且正在使用 select() 来不阻塞 I/O。有多个客户端连接到代理,因此我在消息中包含套接字描述符 # 以便我知道将来自服务器的回复消息转发到哪个套接字。
但是,有时 read() 不会收到完整的消息直到空字符,但会在下一轮 select() 中发送消息的其余部分。我想立即收到完整的消息,以便知道将回复转发到哪个套接字(缓冲不起作用,因为当有多个客户端时,我不知道哪个消息属于哪个)。有没有办法在等待空字符到达时不阻塞读取?
TCP 中没有消息之类的东西。它是一个字节流协议。你写字节,它发送字节,你读字节。无法保证您在任何时候将收到多少字节,并且无法保证单次写入写入的数据量与单次读取读取的数据量之间的关联。如果你想要消息,你必须自己实现它们。任何给定的读取都可以读取零个、一个或多个字节,直到缓冲区的长度。这可能是半条消息。可能是一条半消息。它是什么完全取决于你。
如果您正在处理单个消息,请使用 ZeroMQ。它具有大量语言的绑定,并且是网络的一个很好的抽象。事实上,它可以为你处理这个代理模型。