`
goblin_god
  • 浏览: 54429 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

在Android中使用UDT

 
阅读更多

原文链接:http://big-room.org/?p=152
UDT分析及Android平台移植

by BIGROOM posted on 六月 14, 2011
基于UDP的数据传输协议(UDP-based Data Transfer Protocol,简称UDT)是一种互联网数据传输协议,UDT的主要目的是支持高速广域网上的海量数据传输。
因为互联网上标准的数据传输协议TCP并不完美,它不是为所有的具体应用而设计的。在最近的几年,随着光网络及丰富的网络应用的发展,发现TCP并不能满足BDP(延迟带宽产品)的需求。它的AIMD算法大大地减少了TCP的拥塞窗口,但并不能快速地恢复可用带宽。从流级别的理论分析显示,当BDP增幅很大时,TCP变得更加脆弱,更容易丢包。由此可见,TCP在高带宽长距离网络上性能很差。
UDT的最初目的是为了克服TCP在高速广域网中的低效问题。尽管当前部署了各种TCP的变种(如Linux上的BIC TCP,Window上的Compound TCP),但某些问题依然存在。比如,没有任何一个新的TCP变种解决RTT不公平的问题:RTT小的连接占有更多的带宽。而且,随着因特网的演变发展,传输协议将面临一些新的挑战和需求。研究人员需要一个平台快速的开发和测试新的算法和协议。网络研究人员和学生通过UDT可以很简单地实现他们关于传输协议的想法,特别是拥塞控制算法,并在真实网络中进行实验。基于此,基于UDP的数据传输协议——UDT被设计出来。
UDT建于UDP之上,数据包和控制包都是通过UDP传输,并引入了新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。UDT是一个单播协议,并且不考虑多播。UDT通过双工的方式传输数据。
UDT同时支持可靠的数据流传输和部分可靠的数据报传输。由于UDT完全在UDP上实现,它也可以应用在除了高速海量数据传输之外的其它应用领域,例如点到点技术(P2P),防火墙穿透,多媒体数据传输等等。
UDT由开源软件作者谷云洪在美国伊利诺伊大学芝加哥分校攻读博士期间开发,并由他在毕业后继续维护和升级。UDT的开源代码可以在SourceForge上获取,目前的稳定版本是4.8,采用BSD license协议发布。
UDT的软件实现C++的函数库,它包含了UDT的API实现以及编程示例。由于UDT完全采用标准C++开发,具有很好的可移植性,是一个跨平台的协议库,支持Linux、Windows、Mac OS X以及BSD。同时,在很多开源软件爱好者的努力下,UDT又衍生出了UDT-Java、Barchart-UDT、UDT-net、UDT Gateway System等适用于不同应用场合的版本。


UDT的移植
由于UDT完全采用标准C++开发,具有很好的可移植性,不依赖于具体的操作系统,又由于Android采用的是Linux内核,所以理论上UDT完全可以移植到Android架构上。
移植前,首先要获得UDT的适合Linux版本的源代码,于是我从UDT的托管地,全球著名的开源软件开发平台及仓库——SourceForge里用CVS下载到了UDT的最新稳定版的源代码。
这里提到的CVS是一个C/S系统,是一个常用的代码版本控制软件,主要在开源软件管理中使用。这里使用如下命令从CVS服务器上取出最新的源代码。
cvs -d:pserver:anonymous@udt.cvs.sourceforge.net:/cvsroot/udt login
cvs -z3 -d:pserver:anonymous@udt.cvs.sourceforge.net:/cvsroot/udt co -P modulename
下载得到的源代码包括UDT1、UDT2、UDT3、UDT4等版本,本文使用4.8版本即UDT4里面的代码。
仔细阅读README.txt可知源代码文件夹结构如下:
./src:  UDT源代码
./app:  示例程序
./doc:  HTML格式帮助文档
./win:  Windows版本UDT的Visual C++项目文件
使用make来编译源代码,命令如下:make -e os=XXX arch=YYY
UDT支持的os参数有:Linux、BSD、OSX
UDT支持的架构有:IA32、POWERPC、IA64、AMD64
移植步骤:
1、在Ubuntu10.04系统里编译UDT库
在Linux下编译UDT库可以用官方提供的Makefile
编译脚本Makefile内容如下:
C++ = g++
ifndef os
   os = LINUX
endif
ifndef arch
   arch = IA32
endif
CCFLAGS = -fPIC -Wall -Wextra -D$(os) -finline-functions -O3 -fno-strict-aliasing #-msse3
ifeq ($(arch), IA32)
   CCFLAGS += -DIA32
endif
ifeq ($(arch), POWERPC)
   CCFLAGS += -mcpu=powerpc
endif
ifeq ($(arch), SPARC)
   CCFLAGS += -mcpu=sparc
endif
ifeq ($(arch), IA64)
   CCFLAGS += -DIA64
endif
ifeq ($(arch), AMD64)
   CCFLAGS += -DAMD64
endif
OBJS = md5.o common.o window.o list.o buffer.o packet.o channel.o queue.o ccc.o cache.o core.o epoll.o api.o
DIR = $(shell pwd)
all: libudt.so libudt.a udt
%.o: %.cpp %.h udt.h
$(C++) $(CCFLAGS) $< -c
libudt.so: $(OBJS)
ifneq ($(os), OSX)
$(C++) -shared -o $@ $^
else
$(C++) -dynamiclib -o libudt.dylib -lstdc++ -lpthread -lm $^
endif
libudt.a: $(OBJS)
ar -rcs $@ $^
udt:
cp udt.h udt
clean:
rm -f *.o *.so *.dylib *.a udt
install:
export LD_LIBRARY_PATH=$(DIR):$$LD_LIBRARY_PATH
直接进入UDT4/src文件夹,在终端输入make all即可,经GCC编译,生成libudt.a静态库和libudt.so动态库文件。
2、在Ubuntu10.04系统里结合上一步中得到的UDT库,编译运行测试官方提供的示例代码
进入UDT4/app文件夹,发现官方提供了很多示例代码,这里只使用利用UDT传输文件这一测试用例,对应的源文件为:recvfile.cpp,sendfile.cpp。
这里修改app文件夹下的Makefile为:
C++ = g++
ifndef os
   os = LINUX
endif
ifndef arch
   arch = IA32
endif
CCFLAGS = -Wall -D$(os) -I../src -finline-functions -O3
ifeq ($(arch), IA32)
   CCFLAGS += -DIA32 #-mcpu=pentiumpro -march=pentiumpro -mmmx -msse
endif
ifeq ($(arch), POWERPC)
   CCFLAGS += -mcpu=powerpc
endif
ifeq ($(arch), IA64)
   CCFLAGS += -DIA64
endif
LDFLAGS = -L../src -ludt -lstdc++ -lpthread -lm
ifeq ($(os), UNIX)
   LDFLAGS += -lsocket
endif
DIR = $(shell pwd)
APP = sendfile recvfile
all: $(APP)
%.o: %.cpp
$(C++) $(CCFLAGS) $< -c
sendfile: sendfile.o
$(C++) $^ -o $@ $(LDFLAGS)
recvfile: recvfile.o
$(C++) $^ -o $@ $(LDFLAGS)
clean:
rm -f *.o $(APP)
install:
export PATH=$(DIR):$$PATH
这样就可以只编译出我们需要的recvfile和sendfile两个二进制可执行文件。
先在sendfile所在目录创建一个测试文件,命名为remotefile。
分别打开两个终端,在终端1中输入./sendfile 6666
终端2中输入./recvfile 127.0.0.1 6666 remotefile localfile
运行后将在recvfile所在目录获得一个和remotefile内容一样的localfile,表明测试成功。
3、用Android NDK编译UDT库
接下来开始移植UDT库到Android环境中。
分析可知由于UDT使用C++编写,需使用支持C++的android-ndk-r4-crystax编译链来编译。
3.1 新建一个文件夹,命名为jni,将UDT4/src中所有代码文件复制到jni文件夹里面。
3.2 分析src中的Makefile可以写出如下Android NDK编译所需的Android.mk文件,内容如下:
LOCAL_PATH := $(call my-dir)
LOCAL_CPP_EXTENSION:=.cpp
include $(CLEAR_VARS)
LOCAL_MODULE    := udt
LOCAL_SRC_FILES := md5.cpp common.cpp window.cpp list.cpp buffer.cpp packet.cpp channel.cpp queue.cpp ccc.cpp cache.cpp core.cpp epoll.cpp api.cpp
include $(BUILD_SHARED_LIBRARY)
打开终端,进入jni所在目录,输入命令ndk-build,经过编译即可在libs/armeabi目录中生成动态共享库libudt.so,该库可用于Android架构。
4、用Android NDK结合上一步中得到的Android版UDT库,编译运行官方提供的示例代码
接下来,参考recvfile.cpp文件编写可运行于Android手机的程序,该程序可接收远程PC机中的文件。
该程序的编写分为两个部分:NDK库函数层和Java GUI调用层。
NDK库函数层用到的udtrecvfile.cpp相对于recvfile.cpp文件增加了接收server_ip、server_port、remote_filename、local_filename参数的jni函数。
使用android-ndk-r4-crystax将上述代码编译成libudtrecvfile.so动态共享库,Android NDK所需的Android.mk的内容为:
LOCAL_PATH := $(call my-dir)
LOCAL_CPP_EXTENSION:=.cpp
include $(CLEAR_VARS)
PATH_TO_UDT_SOURCE:=./include/
PATH_TO_LIBUDT_SO:=./lib/
LOCAL_C_INCLUDES += $(PATH_TO_UDT_SOURCE)
LOCAL_LDLIBS += -L$(PATH_TO_LIBUDT_SO) -ludt
LOCAL_MODULE    := udtrecvfile
LOCAL_SRC_FILES := udtrecvfile.cpp
include $(BUILD_SHARED_LIBRARY)
Java GUI层代码为src/prox/AndroidUDTRecvFileTest/AndroidUDTRecvFileTest.java,其中声明了本地函数RecvFileFromServer,方法如下:
public native String RecvFileFromServer(String UDTServerAddress,String UDTServerPortStr,String RemoteFileName,String LocalFileName);
并且需要加载NDK库,方法如下:
static {
System.loadLibrary("udt");
System.loadLibrary("udtrecvfile");
}
编译生成AndroidUDTRecvFileTest.apk文件,上传到手机中安装。
测试时,先在PC端运行sendfile,再在手机中运行AndroidUDTRecvFileTest,结果发现在SD卡的根目录下生成名为localfile的文件,经查看,其内容与remotefile一样,表明移植成功。
5、移植完成
THIS ENTRY WAS POSTED IN ANDROID. BOOKMARK THE PERMALINK.
分享到:
评论
1 楼 lhktbaihc 2012-10-19  
你好!   我也下载了你说的这个udt4.8 版本,之前是用的ndk r5b  编译不过,说是找不到sys/epoll.h    然后又用了你上面说的ndk 版本,也一样的错
珳问下,要怎么改啊

相关推荐

    android_UDT通信

    在Android应用中,UDT的使用通常涉及JNI,因为UDT的API主要由C/C++编写。通过JNI,我们可以调用C/C++的UDT接口来执行数据传输操作。首先,创建一个JNI函数接口,在Java类中声明对应的native方法,然后在对应的C/C++...

    UDT-C,UDT库C语言版本

    UDT-C是UDT协议的C语言实现版本,它提供了C语言接口,方便开发者在C程序中集成UDT功能。UDT-C的开源性质意味着开发者可以查看其源代码,理解其工作原理,并根据需要进行定制和优化。对于那些希望在Linux系统上构建高...

    c# UDT调用封装

    在C#中使用UDT,我们需要一个UDT库。从提供的压缩包文件名来看,`UDTLibary`可能包含了UDT的C#封装库,而`UDTCommon`可能包含了一些通用的UDT相关工具类或常量。通常,这样的库会提供套接字接口,允许开发者像使用...

    UDT源码c#封装

    总结来说,"UDT源码c#封装"是一项旨在将UDT协议与C#编程环境相结合的工作,通过创建高级接口和通信类,使得在C#应用中使用UDT变得更加简单和直观。这种封装技术对于需要高性能、低延迟网络传输的场景,如大数据传输...

    TIA博途中通过UDT实现IO地址映射到DB块中的具体方法.docx

    首先,我们需要在TIA博途软件中新建一个项目,并在此项目中添加一个新的UDT数据类型“Iomap”。该数据类型被定义为一个数组(Array),其元素类型为Byte,数组的长度设置为50个元素。即:Array[0..49] of Byte。这一...

    UDT for Delphi源码

    5. **示例程序**(Demo):通常会提供一个或多个示例程序,演示如何在 Delphi 中使用 UDT for Delphi 库,帮助开发者快速上手。 在实际开发中,你可以通过以下步骤使用 UDT for Delphi: 1. **导入库**:将 UDT ...

    udt封装包网络传输

    为了在实际应用中使用UDT,开发者需要了解如何正确配置和初始化UDT套接字,处理连接建立、数据发送和接收、错误检测与恢复等环节。此外,理解UDT的拥塞控制策略和流控机制对于优化传输性能至关重要。UDT的API通常...

    UDT epoll使用

    在UDT中,epoll是一个重要的I/O多路复用技术,用于高效地管理多个网络连接。 **UDT协议详解:** UDT的设计目标是提供比TCP更高的吞吐量和更低的延迟,同时保持TCP的可靠性。它通过以下特性实现了这一目标: 1. **...

    udt源码c#导出 封装

    本文将详细讲解UDT源码在C#中的封装过程、常见问题及解决方法,以及如何在C#测试项目中应用UDT。 首先,UDT源码的C#封装涉及到的主要步骤包括: 1. **理解UDT协议**:UDT协议主要设计用于大数据传输,其特点是低...

    udt协议开发包

    6. **API接口**:UDT SDK 提供了一系列的C语言接口,包括建立连接、发送数据、接收数据、关闭连接等,方便开发者在自己的应用程序中集成UDT功能。 7. **性能优化**:UDT在设计时考虑了多线程和异步处理,以提高系统...

    udt无聊通信java实现修正

    在Java中实现UDT需要对原始的UDT源码进行一定的修改和封装,以便更好地适应Java环境和应用程序的需求。这个"udt无聊通信java实现修正"项目,就是针对UDT的Java实现进行优化和修复的工作。 首先,原始的UDT可能存在...

    UDT源码最新版

    UDT在许多需要高速传输大量数据的应用场景中非常受欢迎,例如视频流媒体、大数据传输和在线游戏。本文将深入探讨UDT的源码,特别是最新版本中的关键技术和实现细节。 首先,UDT源码是用C++编写的,这使得它具有高度...

    西门子S7-300_UDT复杂数据类型_最简易快速教程

    - **定义:**UDT允许用户根据自己的需求创建特定的数据结构,这些结构可以在整个项目中重复使用。 - **优势:** - **简化编程:**通过定义通用的数据结构,可以减少编程工作量并提高代码的可读性和可维护性。 - **...

    UDT接口文档说明

    UDT的概要说明,参数设置,接口说明等。如配置设置 读取和设置选项通过getsockopt和setsockopt方法,一般不要修改默认选项除非应用不能正常运行。...UDT_REUSEADDR设置UDP端口是否可以给其他UDT使用,默认值是true。

    udt 4.8 基于udp的可靠通讯

    UDT(UDP-based Data Transfer Protocol)是一种用于网络通信的开源协议,主要设计用来提供类似于TCP的可靠传输服务...开发者在使用UDT时,应充分理解其工作原理,并根据实际需求调整相关参数,以获得最佳的传输效果。

    udt协议java版修改

    在Java环境中,UDT通常需要通过第三方库来实现,因为它不是Java标准库的一部分。 在“udt协议java版修改”这个主题中,我们主要关注的是对网上公开的Java实现进行了调整和优化,以适应特定的项目需求。首先,原版的...

    udt UDT网络传输协议开源包,是基于UDP的可靠传输协议

    UDT(User Datagram Transport)是一种高性能的、基于UDP(User Datagram Protocol)的可靠传输协议,专为大数据量的...在"udt3"这个压缩包中,可能包含了UDT协议的源代码、文档、示例程序等内容,供开发者学习和使用。

    udt 基于udp的可靠连接

    `readme.txt`可能包含了关于UDT库的安装、配置和使用说明,而`udt4`可能是一个UDT的特定版本或库文件,用于开发和集成UDT功能到应用程序中。开发人员可以通过阅读文档了解如何在自己的项目中集成UDT,实现基于UDP的...

    udt源码,纯C语言实现。

    1、udt c语言实现,支持跨平台; 2、优势:适用于嵌入式设备,编译库比较小; 3、udt网络传输协议开源包,是基于UDP的可靠传输协议; 4、linux平台下具体适用方式如下: make # compile make clean # cleanup ...

    S7_300中UDT与STRUCT型数据总结.doc

    "S7_300中UDT与STRUCT型数据总结" ...然后,我们可以在FC或FB中使用这个数组变量来传递电机的输入变量。 在UDT类型的数据可以帮助我们简化编程过程,提高编程效率,提高系统的可维护性和可扩展性。

Global site tag (gtag.js) - Google Analytics