C:使用send()发送长字符串

时间:2010-09-22 01:23:04

标签: c networking send

我正在使用Linux并尝试通过send()发送长消息。消息是1270字节,但我的客户端应用程序只接收1024字节。

由于1024字节是一个非常方便的数字,我猜测send()一次只能发送1024个字节。 我查看了发送的手册页,但所有关于长消息的内容都是:

  

当消息不适合套接字的发送缓冲区时,发送()   通常阻塞,除非套接字已放置在非阻塞I / O中   模式。在非阻塞模式下,它将失败并出现错误EAGAIN或EWOULD-   在这种情况下阻止。 select(2)调用可用于确定何时调用   可以发送更多数据。

我正在使用阻止模式,手册页没有说明要做什么。 我发送的确切电话看起来像这样: send(socket, message, strlen(message), 0);

我是否需要将字符串拆分为1024字节块并单独发送?我的客户如何处理这个问题?如果我的客户需要做任何事情,我只会提到它是用Java编写的,它使用InputStreamReader来接收数据。

2 个答案:

答案 0 :(得分:5)

您对send实际如何运作存在误解。它不会向你发送任何内容,它会发送最多作为参数传入的字节数。这意味着您必须检查send的返回值,删除实际从发送队列发送的字节数,并尝试通过另一个发送调用发送剩余的内容。顺便说一下,对于recv也是如此。

答案 1 :(得分:1)

除了Jim Brissom所说的内容之外,值得指出的是SOCK_STREAM套接字(即TCP)具有消息边界的概念 - 连接是只有一个非结构化字节流。

仅仅因为您发送了100个字节(比方说)和一个send()来电,意味着它将以100个字节的一个recv()来电。在极端情况下,它可以分别以100个单独的recv()到达1个字节 - 或者在另一个中,它可以作为较大recv()的一部分到达,以及先前或后续数据。

您的接收方必须能够处理此问题 - 如果您需要在流中定义单个消息,您必须在应用层自己在流上强加某种结构。