首页 > 程序开发 > 综合编程 > 其他综合 >

异步传输中的批量发送问题

2017-04-14

异步传输中的批量发送问题:网络传输涉及发送与接收两方面, 其中接收较为简单, 而发送却非常复杂, 通常会涉及一二个难点。

异步传输中的批量发送问题:网络传输涉及发送与接收两方面, 其中接收较为简单, 而发送却非常复杂, 通常会涉及一二个难点。

一: 异步发送时的数据乱序列问题

如果不等上一次数据发完就进行下一次的异步发送, 无法对包的先后顺序进行控制, 所以接收端将无法解析包,

导致接收的数据没有任何意义; 针对这个现象, 有人提出弄一个队列, 向队列投递数据, 发送完队列中的一个再发

下一个; 这种方法是可以解决问题的, 但完全损害了采用异步发送的初衷, 如果这样还不如直接采用同步发送来得好;

这样还可以省一个队列; 如果采用队列, 数据又不能发送出去, 就可能产生内存的暴涨问题, 又如何解决;

如果从socket层面来看, 这个问题是没有好的解决方法的, 但如果从我们发送的数据方面来着手, 就很容易解决了;

为了使接收端能解析接收到的乱序包, 必须为每个包的包头添加对应的标志符, 指定这个包的用处, 及收到后如何重新

组装成一个新的包; 这样我们就可以无顾忌的发送了; 但这也造成了网络资源的浪费, 因为每个包可能会多一两个字节;

一般而言, MAC 层接收的包数据大概在1400左右, 就相当于多产生了 1/700 的流量; 当然我个人觉得这个附加流量是非常

小的了. 所以这种方案最划算;

二: 异步发送时, 数据发送丢失的现象:

有时候发送一个数据包, 可能有点大, 一次性发不完, 需要多次发送, 而异步投递有一个回调函数, 我们可以把发送的字节

及剩余的字节数,还有本次发送负责的数据块 传递进来; 这样我们在回调里就再次进行发送; 让剩下的数据发完; 当然如果怕

乱序, 还是要加上相应标志位来传输; 通常为了保证数据发送能一次性完成, 都定义成以太网的包大小即可, (1400个字节);

第二个难点, 其实并不难; 只是要注意, 发送的时候不要采用临时内存, 免得没发送完第二次发送时内存无效的现象发生。

相关文章
最新文章
热点推荐