通过套接字发送10 MB的缓冲区 - 块或整个10MB?

时间:2015-08-06 08:30:40

标签: java c++ sockets send tcp-ip

我正在将必须从我的C ++函数发送的详细信息转换为Java作为字符串以及将通过套接字发送的char *。

我的缓冲区大小为10 MB。我可以一次性发送10MB,还是应该拆分并发送更小的内存块?

这两种方法有什么区别?如果我应该发送更小的内存应该是块大小?

2 个答案:

答案 0 :(得分:3)

  

我可以一次性发送10MB

  

或者我应该拆分并作为较小内存的块发送?

没有

  

这两种方法有什么区别?

不同之处在于,在案例1中,您正在让TCP做出所有擅长的决策,并且拥有您所拥有的所有额外知识,关于路径MTU,RTT,接收窗口在同行,...而在案例2中,你正试图为它做TCP的工作。养狗和吠叫自己。

  

如果我应该发送更小的内存应该是块大小?

尽可能大。

答案 1 :(得分:2)

调用write()函数时,提供缓冲区和要写入的字节数。但是,无法保证操作系统将一次性发送/写入您愿意写入的所有字节。 (如果阻塞套接字,write()调用将阻塞,直到它将整个块复制到TCP缓冲区。但是如果是非阻塞的,则write()将返回并且不会阻塞并且会写入只是它能够的字节。

TCP / IP堆栈在操作系统中运行,每个操作系统都有自己的堆栈实现。该堆栈将确定缓冲区大小,而且TCP / IP本身将处理所有低级统计信息,例如MSS,可用的接收器窗口大小,这将使TCP运行流量控制,拥塞控制相关算法。

因此,最好让TCP决定如何发送数据。不要将数据分成块,而是让TCP堆栈为您完成。

请小心,始终检查write()调用返回的实际发送的字节数。