我正在将必须从我的C ++函数发送的详细信息转换为Java作为字符串以及将通过套接字发送的char *。
我的缓冲区大小为10 MB。我可以一次性发送10MB,还是应该拆分并发送更小的内存块?
这两种方法有什么区别?如果我应该发送更小的内存应该是块大小?
答案 0 :(得分:3)
我可以一次性发送10MB
是
或者我应该拆分并作为较小内存的块发送?
没有
这两种方法有什么区别?
不同之处在于,在案例1中,您正在让TCP做出所有擅长的决策,并且拥有您所拥有的所有额外知识,关于路径MTU,RTT,接收窗口在同行,...而在案例2中,你正试图为它做TCP的工作。养狗和吠叫自己。
如果我应该发送更小的内存应该是块大小?
尽可能大。
答案 1 :(得分:2)
调用write()
函数时,提供缓冲区和要写入的字节数。但是,无法保证操作系统将一次性发送/写入您愿意写入的所有字节。 (如果阻塞套接字,write()
调用将阻塞,直到它将整个块复制到TCP缓冲区。但是如果是非阻塞的,则write()将返回并且不会阻塞并且会写入只是它能够的字节。
TCP / IP堆栈在操作系统中运行,每个操作系统都有自己的堆栈实现。该堆栈将确定缓冲区大小,而且TCP / IP本身将处理所有低级统计信息,例如MSS,可用的接收器窗口大小,这将使TCP运行流量控制,拥塞控制相关算法。
因此,最好让TCP决定如何发送数据。不要将数据分成块,而是让TCP堆栈为您完成。
请小心,始终检查write()
调用返回的实际发送的字节数。