C#-NetworkStream.beginRead的问题

发布于 2016-11-16 01:23:56 字数 154 浏览 1464 评论 1

NetworkStream.beginRead可以用来做非阻塞读取
可是我碰到的包是这样的,先读取一个4字节的 int32,作为包体的长度
然后在读取这个长度的字节数组

这样应该怎么处理?是设置一个比较大的缓冲区吗?
还是起两次beginRead?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浮生未歇 2017-03-22 22:28:21

实际上异步通知,是由内核缓冲区->.net CLR->你的应用程序的过程。
设置异步通知后,.net CLR会根据你设置的一次接收数据长度通知你,即在一定时间间隔内把min(设置的接收数据长度,实际CLR缓冲区数据大小)个大小的数据传递给你。否则接收一字节就通知你或永远也接收不到你设置的长度怎么办?
所以,不用把包头设置为包大小,然后"先读取一个4字节的 int32"的办法。发送端和接收端约定好,每次发送多少数据(注意要小于一个包的最大MTU,一般是1048,设置成1024就行,否则发送或接收不完全)。申请上面说的固定大小的字节数组保存数据。收到异步通知后,直接处理这些数据,然后继续等待接收异步通知。

另外,若数据包格式不能改,使用同步方式。要看你的实际应用,很多时候异步的方式不如同步。当然也可以设置包头为数据大小,因为异步通知接收的数据,可能小于你设置的接收的最大长度,这时使用包头判断读取多少字节。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文