[1]UT库的引入
[2]UT连接和参数
[3]UT添加种子
[4]UT传输状态检测
[5]UT传输完成
[2]UT连接和参数
UT连接,由3个文件的关键块hash , 加3个文件的全文校验hash ,
外加文件的长度和文件名组成,文件名允许采用BASE64编码,目前支持的最长文件名是200个UTF8字符长度.
Ut:|8|0|0|621346816|8E473367BAB6DD85|EB0EA6EA7F871CA8|E3350411B4114EFE|32083A2D4402174E|2186A707F49FA0ED|1FB0AF9376FB3C3D|0|0|0|0*Windows_XP_SP2_VOL.iso
这里,621346816是文件长度,8E473367BAB6DD85|EB0EA6EA7F871CA8|E3350411B4114EFE是文件关键块的校验,接下来3个是文件全文校验.
由于ut采用的是多对多的P2P传输,为了避免传输内容出错,需要在传输前把文件分块,并计算每个块的内容校验码,并把这些校验码保存到同名文件.ut中,这就是我们看到的.ut种子校验文件,如果没有这个文件,UT无法启动做种,也就是,在UT做种前,必须完成文件校验文件的生成.
在做种模式下,需要提供文件的UT连接,并确保.ut文件存在;
在下载模式下,则只需要获取UT连接,并能够添加至少1个种子.
//核心创建成功现在设置参数吧
::PUT2_SetParaForChannel(pcore,8,10,3,0,18,0);//第一个参数,是主动通道数量非种子模式千万不要设置主动连接数量为
::PUT2_SetDownTaskAutoRename(pcore,true);//下载任务成功完成后自动执行改名等操作
::PUT2_SetMyUniqueCode(pcore,NULL);//初始化我们任务的唯一ID
::PUT2_SetParaForSocket(pcore,uport);//其他采用默认参数上面那个是基准端口在这个基础上生成随机端口
//::PUT2_SetRandomStreamMode(pcore,true);//因为我们不是支持流播放,因此没必要打开
::PUT2_SetNetMode(pcore,true,false);//设置为只用在内网,IPV4,因为本代码没有携带公网授权码,因此本代码只能用在IPV4
内网
//注意这里如果要使用在公网必须获得正确的授权
//::PUT2_SetLicenseString(pcore,UTLIB_LICENSECODESTR);
//由于采用种子模式启动因此这里需要分解出文件所在的目录
pdir=(char
*)malloc(1+wcslen(argv[3])*5);
if(pdir==NULL)
{
::PUT2_FreeP2PCore(pcore);
::wprintf(L"Memory out for
pdir ...\nPress a key to exit....\n");
::getchar( );
return 0;
}
memset(pdir,0,1+wcslen(argv[3])*5);
//直接转换
WideCharToMultiByte( CP_UTF8, 0, argv[3], -1,
pdir,(int)(wcslen(argv[3])*5),
NULL, NULL );
if(::PUT2_SetTaskByUrl(pcore,buffurl,pdir,false)==false)
//注意这里的最后一个参数false 代表以下载模式启动任务
{
::PUT2_FreeP2PCore(pcore);
free(pdir);
::wprintf(L"SetTaskByUrl
failed ...\nPress a key to exit....\n");
::getchar( );
return
false;
}
::PUT2_SetUpdSingleTransferMode(pcore,false);//注意,有些路由器,例如老的CISCO,或者新路由器被设置为非透明模式,常见的大学对公路由常常使用这种模式那么需要设置这个参数采用单一连接虽然速度可能受影响但是能保证不断线
::PUT2_SetUpdTransferMode(pcore,false);//让UT
P2P根据网络占用自动调整,这样不会影响您其他操作,如果设置为TRUE,那么会始终全速传输
::PUT2_SetUpnpMode(pcore,true);//如果您是在家里通过路由器上网,那么打开,这个可以把你的端口映射到INTERNET,注意,这个一般只针对家用或者SOHO路由,大型路由都关闭了UPNP支持,
如果是SERVER系统,请关闭这个功能
//完成参数的设置
iresult=0;
if(::PUT2_TryStartCore(pcore,&iresult)==false)
{
//如果启动失败了
::PUT2_FreeP2PCore(pcore);
free(pdir);
::wprintf(L"Failed to start
ut core, error=%d\nPress a key to exit....\n",iresult);
::getchar( );
return 0;
}
//输出成功启动的端口参数
::wprintf(L"Success start
ut core.... port=%u\n",::PUT2_GetSocketPortNum(pcore));
而做种模式则有点不同,看下面的代码
//转换成功
//现在我们首先进行UT HASH制作,如果已经存在UT HASH,那么跳过
//注意这是种子模式特有的一般都在做种前提前完成HASH计算
//因为HASH计算非常耗费时间和硬盘IO
if(::PUT2_TryGetUrlDirectFromUtFile(pbuff,buffurl,true)==false)
//如果之前的HASH连接没有制作过
{ wprintf(L"Please wait a
moment for ut hash ready......\n");
if(::PUT2_MakeLocalFileForUtWithUtlAndProcess(pbuff,buffurl,1,NULL,NULL,NULL)==false)
{
free(pbuff);//释放缓冲
::wprintf(L"Failed to make
hash ...\nPress a key to exit....\n");
::getchar( );
return 0;
}
else
{
//否则成功了
//输出UT连接吧
//注意这个连接是没有编码的UTF8连接因此如果文件名如果有中文等字符直接显示会有乱码出现
}
}
//现在可以保证已经获得了UT连接并且完成了UT HASH制作
//注意,如果之前生成的UT HASH文件和文件内容实际不匹配
//那么可能导致传输时会出现失败或者中断等
#ifdef _DEBUG
//测试版本中直接输出UT 连接,注意,因为直接生成的连接是原始连接,如果含有非英文字符会出现乱码
//解决方法是解码后重新生成带BASE64编码的连接这样就可以直接输出
::OutputDebugStringA(buffurl);
#endif
::wprintf(L"==> Now will
try to start ut seed mode....\n");
pcore=::PUT2_CreateP2PCore( );
if(pcore==NULL)
//如果创建核心失败了
{
free(pbuff);//释放缓冲
::wprintf(L"Failed to
create p2p core ...\nPress a key to exit....\n");
::getchar( );
return 0;
}
//核心创建成功现在设置参数吧
::PUT2_SetParaForChannel(pcore,8,10,3,0,18,0);//第一个参数,是主动通道数量,如果是使用在服务器上,那么可以改成,因为服务器不会主动去连接其他UT点
//::PUT2_SetDownTaskAutoRename(pcore,true);//这个参数只针对下载类型的UT,种子模式不起作用
::PUT2_SetMyUniqueCode(pcore,NULL);//初始化我们任务的唯一ID
::PUT2_SetParaForSocket(pcore,uport);//其他采用默认参数上面那个是基准端口在这个基础上生成随机端口
//::PUT2_SetRandomStreamMode(pcore,true);//因为我们不是支持流播放,因此没必要打开
::PUT2_SetNetMode(pcore,true,false);//设置为只用在内网,IPV4,因为本代码没有携带公网授权码,因此本代码只能用在IPV4
内网
//注意这里如果要使用在公网必须获得正确的授权
//::PUT2_SetLicenseString(pcore,UTLIB_LICENSECODESTR);
//由于采用种子模式启动因此这里需要分解出文件所在的目录
pdir=(char
*)malloc(1+wcslen(argv[2])*5);
if(pdir==NULL)
{
::PUT2_FreeP2PCore(pcore);
free(pbuff);//释放缓冲
::wprintf(L"Memory out for
pdir ...\nPress a key to exit....\n");
::getchar( );
return 0;
}
memset(pdir,0,1+wcslen(argv[2])*5);
memcpy(pdir,pbuff,wcslen(argv[2])*5);
//iresult=(int)strlen(pdir);
p=::strrchr(pdir,'\\');
if(p==NULL)
{
::PUT2_FreeP2PCore(pcore);
free(pbuff);//释放缓冲
free(pdir);
::wprintf(L"Bad path
...\nPress a key to exit....\n");
::getchar( );
return 0;
}
p++;
*p='\0';//分离出完整的
if(::PUT2_SetTaskByUrl(pcore,buffurl,pdir,true)==false)
//注意最后一个参数true,表示以种子模式启动任务这个参数千万不能用错
{
::PUT2_FreeP2PCore(pcore);
free(pbuff);//释放缓冲
free(pdir);
::wprintf(L"SetTaskByUrl
failed ...\nPress a key to exit....\n");
::getchar( );
return
false;
}
::PUT2_SetUpdSingleTransferMode(pcore,false);//注意,有些路由器,例如老的CISCO,或者新路由器被设置为非透明模式,常见的大学对公路由常常使用这种模式那么需要设置这个参数采用单一连接虽然速度可能受影响但是能保证不断线
::PUT2_SetUpdTransferMode(pcore,false);//让UT
P2P根据网络占用自动调整,这样不会影响您其他操作,如果设置为TRUE,那么会始终全速传输
::PUT2_SetUpnpMode(pcore,true);//如果您是在家里通过路由器上网,那么打开,这个可以把你的端口映射到INTERNET,注意,这个一般只针对家用或者SOHO路由,大型路由都关闭了UPNP支持,
如果是SERVER系统,请关闭这个功能
//完成参数的设置
iresult=0;
if(::PUT2_TryStartCore(pcore,&iresult)==false)
{
//如果启动失败了
::PUT2_FreeP2PCore(pcore);
free(pbuff);//释放缓冲
free(pdir);
::wprintf(L"Failed to start
ut core, error=%d\nPress a key to exit....\n",iresult);
::getchar( );
return 0;
}
//输出成功启动的端口参数
::wprintf(L"Success start
ut core.... port=%u\n",::PUT2_GetSocketPortNum(pcore));
|