网上与UDT相关的资料不多,与UDT相关的源码例子更少。最近在接触UDT,也是因为缺少相关的资料,导致学习起来甚感痛苦。下面将我自己这两天弄出来的代码贴出来,希望对在寻找相关资料的童鞋有一定的帮助。与服务端相对应的客户端在另一篇博文中

SERVER端

  1. #include <iostream>
  2. #include "udt.h"
  3. #include <io.h>
  4. #pragma comment(lib,"ws2_32.lib")
  5. using namespace std;
  6. #define MAXLEN 4096
  7. int main(int argc,char *argv[])
  8. {
  9. if ((argc != 4))
  10. {
  11. cout<<"Use: appserver.exe server_port client_ip client_port"<<endl;
  12. return 0;
  13. }
  14. //startup
  15. //这里是对UDT的启动记性初始化操作
  16. if (UDT::ERROR == UDT::startup())
  17. {
  18. cout<<"startup: "<<UDT::getlasterror().getErrorMessage()<<endl;
  19. }else{
  20. cout<<"startup suc..."<<endl;
  21. }
  22. //socket
  23. //像声明一个普通的socket一样声明一个UDTSOCKET
  24. UDTSOCKET serv = UDT::socket(AF_INET, SOCK_DGRAM, 0);
  25. if (UDT::ERROR == serv)
  26. {
  27. cout<<"socket: "<<UDT::getlasterror().getErrorMessage()<<endl;
  28. }else{
  29. cout<<"client suc..."<<endl;
  30. }
  31. //声明udp socket,这里是udp的哈,不是udt
  32. int sersocket = socket(AF_INET,SOCK_DGRAM,0);
  33. if (SOCKET_ERROR == sersocket)
  34. {
  35. cout<<"udp socket error!"<<endl;
  36. }else{
  37. cout<<"clientsocket suc..."<<endl;
  38. }
  39. //为了能够在局域网中直接进行处理,先默认设置两个
  40. sockaddr_in my_addr,client_addr;
  41. my_addr.sin_family = AF_INET;
  42. my_addr.sin_port = htons(atoi(argv[1]));
  43. my_addr.sin_addr.s_addr = INADDR_ANY;
  44. memset(&(my_addr.sin_zero), '\0', 8);
  45. bind(sersocket,(struct sockaddr*)&my_addr,sizeof(my_addr));
  46. client_addr.sin_family = AF_INET;
  47. client_addr.sin_port = htons(atoi(argv[3]));
  48. client_addr.sin_addr.s_addr = inet_addr(argv[2]);
  49. //client_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  50. memset(&(client_addr.sin_zero), '\0', 8);
  51. int mss = 1052;//最大传输单位
  52. //设置收发缓冲区大小 接收限时  和地址重用
  53. if(   !( UDT::ERROR != (UDT::setsockopt(serv, 0, UDT_SNDBUF, new int(32000), sizeof(int)))
  54. && UDT::ERROR != (UDT::setsockopt(serv, 0, UDP_RCVBUF, new int(32000), sizeof(int)))
  55. && UDT::ERROR != (UDT::setsockopt(serv,0,UDT_REUSEADDR,new int(1),sizeof(int)))
  56. && UDT::ERROR != (UDT::setsockopt(serv, 0, UDT_RENDEZVOUS, new bool(true), sizeof(bool))))
  57. && UDT::ERROR != (UDT::setsockopt(serv, 0, UDT_MSS, &mss, sizeof(int)) ))
  58. {
  59. cout<<"udt socket: "<<UDT::getlasterror().getErrorMessage()<<endl;
  60. UDT::close(serv);
  61. return 0;
  62. }
  63. //这里是直接将udp的接口绑定在udt的接口之上,如果不这样做的话是没法使用UDT中的SOCK_DGRAM的
  64. if (UDT::ERROR == UDT::bind2(serv,sersocket))
  65. {
  66. cout<<"udt bind2:"<<UDT::getlasterror().getErrorMessage()<<endl;
  67. return 0;
  68. }else{
  69. cout<<"bind2 suc"<<endl;
  70. }
  71. //这里也是关键部分,与client端对应的connect操作,就是相互之间的打洞处理
  72. if (UDT::ERROR == UDT::connect(serv, (sockaddr*)&client_addr, sizeof(client_addr)))
  73. {
  74. cout << "connect: " << UDT::getlasterror().getErrorMessage();
  75. UDT::close(serv);
  76. return 0;
  77. }else{
  78. cout<<"connetc suc"<<endl;
  79. }
  80. //这里已经可以正常接收了,接收从client发过来的filename,目的是用于本地的文件创建
  81. char filename[100];
  82. if (UDT::ERROR == UDT::recvmsg(serv, filename, 100))
  83. {
  84. cout << "recv:" << UDT::getlasterror().getErrorMessage() << endl;
  85. return 0;
  86. }
  87. cout <<"filename: "<< filename <<endl;
  88. //使用FILE进行文件操作,关于文件的相关操作这里不详述了,实在不懂的可以留言
  89. FILE *fp;
  90. char localfile[100];
  91. memset(localfile,0,sizeof(localfile));
  92. strcpy(localfile,"d:\\");
  93. strcat(localfile,filename);
  94. if((fp = fopen(localfile,"w+"))==NULL)
  95. {
  96. cout<<filename<<" open failure!"<<endl;
  97. return 0;
  98. }
  99. fclose(fp);
  100. fp = fopen(localfile,"wb");
  101. char data[MAXLEN];
  102. int len=0,package=0,filelen=0;
  103. UDT::TRACEINFO trace;
  104. UDT::perfmon(serv,&trace);
  105. while(1)
  106. {
  107. //前面部分打开文件后,这里就是循环接收文件并保存
  108. memset(data,0,sizeof(data));
  109. len = UDT::recvmsg(serv, data, MAXLEN);
  110. filelen += len;
  111. //cout<<"filelen = "<<filelen<<endl;
  112. if (strncmp("quit",data,4)==0)
  113. {
  114. cout<<data<<endl;
  115. fclose(fp);
  116. break;
  117. }else
  118. {
  119. package ++;//record recv all the packages
  120. }
  121. fwrite(data,len,1,fp);
  122. }
  123. fclose(fp);
  124. fp = fopen(localfile,"rb");
  125. fseek(fp,0,SEEK_END);//move to the end
  126. filelen = ftell(fp)
  127. fseek(fp,0,SEEK_SET);
  128. cout<<"filesize = "<<filelen<<endl;
  129. UDT::perfmon(serv,&trace);
  130. cout << "speed = " << trace.mbpsRecvRate << "Mbits/sec" << endl;
  131. cout<<"recv all the packages: "<<package<<endl;
  132. fclose(fp);
  133. UDT::close(serv);
  134. UDT::cleanup();
  135. return 1;
  136. }
 
 

运行效果截图:

 
注:要想运行这两个程序直接把源代码复制下来,然后去运行肯定是不行的,这个是需要UDT其它类库的支持的,也就是说,需要你将UDT的源代码文件拷贝进你的项目文件中才行。源代码下载地址:http://blog.csdn.net/pingd/article/details/14519881
简单截图如下:

基于UDT connect连接通信以及文件传输--服务端的更多相关文章

  1. 基于UDT connect连接通信以及文件传输--客户端

    上面一篇文章中提出了服务端的,其实这里没有严格意义的服务端和客户端之分,因为我在代码中是基于UDP的,不存在服务端与客户端,两个都是对等的,只是我这里进行一下简单的区分而已.在这里,客户端所进行的主要 ...

  2. secureCRT连接服务器和文件传输( 一步搞定)

    1.在百度云盘存有此工具,获取到后解压执行即可,如下2 连接目标服务器 192.xxx.xx.xx 2.secureCRT连接服务器和文件传输 ,现象如下 登录后切换到root用户即可有权限操作    ...

  3. WCF大文件传输服务

    由于项目需要,自己写一个基于WCF的大文件传输服务雏形.觉得有一定的参考价值,因此放在网上分享. 目前版本为v1.1特点如下: 1.文件传输端口为18650 2.上传和下载文件 3.支持获取文件传输状 ...

  4. FTP文件传输服务

    FTP文件传输服务 一 .FTP 连接及传输的模式 l  控制连接:TCP21,用于发送FTP命令信息. l  数据连接:TCP 20, 用于上传下载数据. · 数据连接建立的类型: ·主动模式: 服 ...

  5. Python自带HTTP文件传输服务

    一行命令搭建一个基于python的http文件传输服务 由于今天朋友想要一个文件,而我恰好有,因为这个文件比较大,网速不是很给力,所以想到了python自己有这么一个功能,这样不仅不需要下载其他软件, ...

  6. 网站优化与Cdn文件传输服务

    网站优化与Cdn文件传输服务 如今互联网无处不在,其方便快捷.性质和低成本的经济特点,已经逐渐成为商务贸易.信息分发和数据交付的一个重要渠道.要想让数据的分发带来巨大的效益,那么网民的满意是唯一的办法 ...

  7. FTP 文件传输服务

    昨晚心血来潮,尝试用python写了一个ftp文件传输服务,可以接收指令,从远程ftp服务器同步指定目录数据,最后没用上,开源出来. https://github.com/jadepeng/ftp_t ...

  8. httpurlconnection发送文件到服务端并接收

    httpurlconnection发送文件到服务端并接收 客户端 import java.io.DataInputStream; import java.io.File; import java.io ...

  9. 部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用

    前面介绍了很多关于ABP框架的后台Web API 服务端,以及基于Vue+Element前端应用,本篇针对两者的联合部署,以及对部署中遇到的问题进行处理.ABP框架的后端是基于.net core5.0 ...

随机推荐

  1. 1082: [SCOI2005]栅栏

    链接 思路 二分+搜索+剪枝. 首先二分一个答案,表示最多可以切出x块.(一个结论:切出的一定是从较小的前x块.如果一个木材可以满足很多个需要的木材,那么切出最小的,就意味着以后再选时的机会更多.) ...

  2. 基于Xtrabackup备份集来恢复某个误删除的表(drop)

      Preface       Yesterday,I've demonstratated how to rescue a droped and a truncated table based on ...

  3. Spring整合EhCache详解

    一.EhCache介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开 源Java分布 ...

  4. Jmeter 参数化之 CSV Data Set Config 循环读取参数

    对于做接口和性能测试,个人感觉Jmeter是一个非常方便易学的工具,今天随笔记录Jmeter 参数化之 CSV Data Set Config. 首先在开始记录之前,先搞明白2个问题 1.什么是参数化 ...

  5. Vue_初识

    前端三大框架: vue:开发效率相当高了. angalar:适合做后台管理系统,入手容易,但是越往后会越难受. react:虚拟dom(渲染内存中存储的dom,经过操作后,才会去渲染浏览器的真实dom ...

  6. NGUI-为Popuplist的下拉选项添加删除功能

    NGUI例子里的popuplist是这样的:,但有时我们希望下拉选项都有删除功能,也就是这样:,一种方法是改popuplist的源码,我想这个实现起来不难,但现在我想说的是用反射来实现此功能,以及其他 ...

  7. 搭建 MongoDB分片(sharding) / 分区 / 集群环境

    1. 安装 MongoDB 三台机器 关闭防火墙 systemctl stop firewalld.service 192.168.252.121 192.168.252.122 192.168.25 ...

  8. HDU 4667 Building Fence 计算几何 凸包+圆

    1.三角形的所有端点 2.过所有三角形的端点对所有圆做切线,得到所有切点. 3.做任意两圆的外公切线,得到所有切点. 对上述所有点求凸包,标记每个点是三角形上的点还是某个圆上的点. 求完凸包后,因为所 ...

  9. Tomcat 顶层结构

    Tomcat中最顶层的容器叫Server,代表整个服务器,Server中包含至少一个Service,用于具体提供服务. Service主要包含两部分:Connector   和   Container ...

  10. 【bzoj2401】陶陶的难题I “高精度”+欧拉函数+线性筛

    题目描述 求 输入 第一行包含一个正整数T,表示有T组测试数据.接下来T<=10^5行,每行给出一个正整数N,N<=10^6. 输出 包含T行,依次给出对应的答案. 样例输入 7 1 10 ...