我正在使用Linux并尝试通过send()发送长消息。消息是1270字节,但我的客户端应用程序只接收1024字节。
由于1024字节是一个非常方便的数字,我猜测send()一次只能发送1024个字节。 我查看了发送的手册页,但所有关于长消息的内容都是:
当消息不适合套接字的发送缓冲区时,发送() 通常阻塞,除非套接字已放置在非阻塞I / O中 模式。在非阻塞模式下,它将失败并出现错误EAGAIN或EWOULD- 在这种情况下阻止。 select(2)调用可用于确定何时调用 可以发送更多数据。
我正在使用阻止模式,手册页没有说明要做什么。
我发送的确切电话看起来像这样:
send(socket, message, strlen(message), 0);
我是否需要将字符串拆分为1024字节块并单独发送?我的客户如何处理这个问题?如果我的客户需要做任何事情,我只会提到它是用Java编写的,它使用InputStreamReader来接收数据。
答案 0 :(得分:5)
您对send
实际如何运作存在误解。它不会向你发送任何内容,它会发送最多作为参数传入的字节数。这意味着您必须检查send
的返回值,删除实际从发送队列发送的字节数,并尝试通过另一个发送调用发送剩余的内容。顺便说一下,对于recv
也是如此。
答案 1 :(得分:1)
除了Jim Brissom所说的内容之外,值得指出的是SOCK_STREAM
套接字(即TCP)不具有消息边界的概念 - 连接是只有一个非结构化字节流。
仅仅因为您发送了100个字节(比方说)和一个send()
来电,不意味着它将以100个字节的一个recv()
来电。在极端情况下,它可以分别以100个单独的recv()
到达1个字节 - 或者在另一个中,它可以作为较大recv()
的一部分到达,以及先前或后续数据。
您的接收方必须能够处理此问题 - 如果您需要在流中定义单个消息,您必须在应用层自己在流上强加某种结构。