C#-NetworkStream.beginRead的问题
NetworkStream.beginRead可以用来做非阻塞读取
可是我碰到的包是这样的,先读取一个4字节的 int32,作为包体的长度
然后在读取这个长度的字节数组
这样应该怎么处理?是设置一个比较大的缓冲区吗?
还是起两次beginRead?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
实际上异步通知,是由内核缓冲区->.net CLR->你的应用程序的过程。
设置异步通知后,.net CLR会根据你设置的一次接收数据长度通知你,即在一定时间间隔内把min(设置的接收数据长度,实际CLR缓冲区数据大小)个大小的数据传递给你。否则接收一字节就通知你或永远也接收不到你设置的长度怎么办?
所以,不用把包头设置为包大小,然后"先读取一个4字节的 int32"的办法。发送端和接收端约定好,每次发送多少数据(注意要小于一个包的最大MTU,一般是1048,设置成1024就行,否则发送或接收不完全)。申请上面说的固定大小的字节数组保存数据。收到异步通知后,直接处理这些数据,然后继续等待接收异步通知。
另外,若数据包格式不能改,使用同步方式。要看你的实际应用,很多时候异步的方式不如同步。当然也可以设置包头为数据大小,因为异步通知接收的数据,可能小于你设置的接收的最大长度,这时使用包头判断读取多少字节。