通过 Windows 套接字发送大于 1 MB 的大数据,即使用 Send 函数

use*_*854 4 sockets windows

我希望通过 Windows 套接字发送 API 发送大于 1 MB 的大消息。有没有一种有效的方法来做到这一点,我不想循环然后以块的形式发送数据。我在某处读到,您可以增加套接字缓冲区大小,这可能会有所帮助。有人可以详细说明一下吗?任何帮助表示赞赏

Mah*_*ive 5

您应该而且实际上必须循环以分块发送数据。

\n\n

正如 Beej 的网络指南中所述:

\n\n
\n

“send() 返回实际发送出去的字节数\xe2\x80\x94,这可能小于你告诉它发送的数量!看,有时你告诉它发送一整块数据,但它就是不能\处理它。它会发送尽可能多的数据,并相信您稍后会发送其余的数据。”

\n
\n\n

这意味着,即使您将数据包大小设置为 1MB,send() 函数也可能无法发送全部数据,并且您将被迫循环,直到调用 send() 发送的字节总数达到总字节数为止。您正在尝试发送。事实上,数据包的大小越大,send() 越有可能不会发送全部数据。

\n\n

除此之外,你不想发送 1MB 数据包,因为如果它们丢失,你将不得不再次传输整个 1MB 数据包,而如果你丢失了 1K 数据包,重新传输它并不是什么大问题。

\n\n

总之,您必须循环 send() 调用,接收者甚至也必须循环其 recv() 调用。您可能需要在每个数据包前面添加一个小标头,以告诉接收者正在发送多少字节,以便接收者可以循环适当的次数。

\n\n

我建议您查看 Beej 的网络指南,以获取有关 send() 和 receive() 以及如何处理此问题的更多详细信息。可以在http://beej.us/guide/bgnet/output/print/bgnet_USLetter.pdf找到

\n