我对如何在 .net 中使用 tcp 流有点困惑。
现在,当我想写40字节时,我将其写入内存流,然后调用ToArray()并将内存流写入网络流+刷新。
在服务器端,我使用 Read(buf, 0, len) 并检查长度是否完全符合我的预期。我这样做是不是很愚蠢?我可以根据需要写入尽可能小的字节,然后在准备好读取时刷新吗?
当我 Read() 时,我总是能得到我期望的长度吗? (假设应用程序正确并且没有发生错误)它会阻塞直到我的尺寸准备好吗?我不需要循环读取并构建我的缓冲区,是吗?假设我期望像 10k 或更高这样的大尺寸,那么我需要构建我的缓冲区吗?
我知道之前的两个答案都在告诉你这一点,但我会重复它们并添加我的一些内容:如果后续发送之间有足够的时间,它将按照您的预期工作,这可能会让您相信它确实有效那样。但事实并非如此。
TCP 很容易被想象成一根水管,在它的一端装满水杯。添加新的一杯水并不能告诉你它的大小,只是向管道中添加了更多的水。
因此,您需要在流中实现您自己的“消息传递”或“打包”。
然而,情况并没有那么糟糕。流是鲁棒的,所以如果你用数据的长度作为前缀,你就能够让它工作——只需在接收端创建某种“数据包收集机制”——有一些缓冲区来保存部分数据包数据,直到你得到你需要的一切。
EDIT:
解决你的问题:
-
Flush()
在这里无关紧要。
- 您将不会得到您期望的尺寸。您将获得 0 到运输途中剩余的任何东西
- 在您的尺寸准备好之前它不会阻塞。它会给你尽可能多的东西(0是可能的)-我认为这种行为可以改变,但它不再有任何字节数
Write()
n 在另一端
- 你需要建立你的缓冲区
- 是的,您确实需要手动构建缓冲区,方法是在数据前面加上其长度前缀
在这里,您对如何读取缓冲区有了一些想法:.NET 阻塞套接字读取直到 X 字节可用? https://stackoverflow.com/questions/6793234/net-blocking-socket-read-until-x-bytes-are-available
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)