【问题标题】:Maximum size of characters that can be sent through TCP socket通过 TCP 套接字可以发送的最大字符大小
【发布时间】:2015-08-13 12:12:52
【问题描述】:

我有一个 C++ 客户端,它在一定的时间间隔后向 Java 服务器应用程序发送一个大字符串(最小大小为 10 KB)。在此期间,c++ 应用程序会累积大量数据并将其完全发送到服务器。服务器也会一次性接收。

我想始终保持字符串变量的大小小于 string::max_size。一旦字符串的大小接近限制,我就会将该字符串发送到服务器并清除字符串,然后才继续收集剩余的数据。

如果字符串可以保存完整的数据,那么整个数据是否会从客户端传输到服务器而不会失败。(假设没有连接重置或出现任何其他此类问题。)

有人可以告诉我这是继续的方式吗?

【问题讨论】:

  • 一般来说,是的。但是,string::max_size 非常大,以至于您可能会在达到该字符串大小之前很久就耗尽内存。但是,如果您设置其他一些更合理的限制 - 那就可以了。
  • 如果您在 Windows 上,UDP/TCP 缓冲区的大小由注册表中的 TcpWindowSize 设置。见technet.microsoft.com/en-us/library/cc938219.aspx
  • @cup 默认尺寸。您可以使用setsockopt() 为每个套接字设置它。无需摆弄注册表。
  • @EJP 是的,但是如果 setsockopt 设置的大小大于注册表中的大小,则它在 windows 上不起作用。

标签: java c++ string max-size


【解决方案1】:

客户端不知道字符串有多大,也不知道何时停止侦听并开始处理接收到的字符串。

您需要将字符串的大小作为 int 发送,然后将数据发送过来。 当服务器接收到所有数据后,就知道字符串接收正确了。

【讨论】:

  • 遗憾的是,SCTP 只是在 Internet 的某些部分(例如移动网络)中广泛使用。 SCTP 将 TCP 样式的可靠性与 UDP 样式的消息边界结合在一起(发送整个消息而不是字节流)。
  • 有趣我不知道。
  • 都是真的,但你还没有真正回答过这个问题。
【解决方案2】:

是的,但我建议您在获取数据时发送数据,而不是增加延迟并浪费空间来缓冲所有数据。 TCP 会处理它。

【讨论】:

  • 感谢您的所有回复,啊@EJP 我必须根据规范仅在等待期过后才发送数据,因此我可以将数据累积到指定大小,这将远小于字符串::maxsize 正如“Bo Persson”正确指出的那样,maxsize 是一个巨大的数字,进程可能会耗尽内存。
  • @dau_sama 如果所有字节都正确接收,这似乎是检查服务器端的正确方法。感谢您的建议。
猜你喜欢
  • 2017-03-14
  • 2020-02-17
  • 2015-01-23
  • 2012-10-13
  • 2020-12-03
  • 2011-02-18
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
相关资源
最近更新 更多