从c ++中的套接字返回值读取

时间:2012-10-27 09:03:03

标签: c++ linux sockets

我需要将套接字的read的返回值强制为等于零而不关闭连接。

我在一个页面中读到以下声明:

  

如果收到文件结束条件或关闭连接,则返回0。

但是我不知道如何在我发送的字符串之后让它接收到这个条件。

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:2)

我担心你不能这样做。

如果希望read返回零,则需要关闭套接字。如果您不想关闭套接字,则需要在协议中发出“通信结束”或“消息结束”的信号。

这样做的常用方法是为每条消息添加长度前缀。这样接收方就知道它何时读取完整的消息并随意做任何事情。

答案 1 :(得分:1)

如果您希望对等方的read()或recv()返回零,则必须关闭套接字或将其关闭以进行输出。在任何一种情况下,你都不能发送任何其他东西。如果该约束不适合您,则必须修改您的要求,因为它没有意义。

答案 2 :(得分:1)

“文件结束条件”和“连接已关闭”条件都告诉接收方在此套接字上不能再接收数据。您无法通过发送一些魔法数据来模拟它。

除了在套接字上调用close之外,您还可以在套接字上使用shutdown(2)来关闭读取端或写入端。这可能在有限的情况下有所帮助,但在一般情况下则不然。

答案 3 :(得分:1)

也许您需要一些多路复用系统调用,如poll(2)

您肯定需要阅读一些好的资料,例如Advanced Linux ProgrammingAdvanced Unix Programming

如果您需要TCP / IP传输来传输应用程序消息,您需要自己关心打包和分段(通过使用固定大小的消息,或者通过某种方式知道传输过程中的逻辑消息大小)。请注意,TCP / IP传输可能会被网络分段。