关于用UDP进行文件传输
如题。现在进行实时传输视频都是基于UDP协议的。但是UDP是极不可靠的。通常是会发生丢包。我现在遇到这样的问题。比如
A:发送端(100Mbps内网,外出口为4M带宽)
B:接收端(外网,2M带宽)
这样进行传输,但是A端发送的速度很快(远远超过了4M),致使B端收不到这么多数据包,也不知道数据包到底丢在哪个地方。如何才能解决平衡问题哪?
因为UDP只管把数据发出去,根本不管数据流向,我考虑过两端一问一答的方式进行通信,但这样又会严重影响到网速,在实时传输中是不允许的。
最后提出最终问题,如何用UDP以最快速率,最低丢包和误码率传输数据那?
大家有什么好办法?
[解决办法]
在应用层实现TCP的窗口协议
[解决办法]
语音和视频数据丢掉就丢掉了,这是应用的特点。文件传输,还是TCP吧,如果没办法TCP,那就自己实现一下:
http://dev.csdn.net/author/huanghongbo/760eee4d4e7f48bbac43495ebd58a872.html
[解决办法]
你定一个简单的确认协议,比如说发送完一个包后就等待接收端发送一个确认的信息过来,然后再发送下一个包。最好给包加个头,头的信息要包含包的编号。
这里给个简单的例子
我定义网络传输的包格式
#define START_PACK 0XFF1
#define ACK_PACK OXFF2
#define DATA_PACK 0XFF3
#define END_PACK 0xFF4
typedef struct _my_packet{
int type; //包类型
unsigned int seq; //包的编号
void *buf; //数据域
}mypack;
这样接收端收到一个DATA_PACK,就回送一个ACK_PACK,接收端等待一定时间如果没有收到包(可能丢包),则重新发送ACK_PACK(因为没有收到END_PACK,表示传输没有结束)。
发送端最先发送START_PACK,并等待ACK_PACK,然后发送DATA_PACK,等待ACK_PACK....传输完毕,发送END_PACK,
实际上你还要考虑到发送端超时问题。
这里只是给你个简单的思路,希望对你有帮助/。
[解决办法]
让他们双方做确认动作呢。
[解决办法]
你可以参考RTP的方法,就是发送的每个数据包都有一个序列号,收端能过检测序列号是否有丢失也判别有没有数据丢失,对有丢失的数据请求重传。