上面一篇文章中提出了服务端的,其实这里没有严格意义的服务端和客户端之分,因为我在代码中是基于UDP的,不存在服务端与客户端,两个都是对等的,只是我这里进行一下简单的区分而已。在这里,客户端所进行的主要操作就是首先给服务端发送文件名,然后将文件直接通过fopen(),fread()等一系列的操作将文件发送过去。

与客户端相对应的源码在另一篇博文中:http://blog.csdn.net/pingd/article/details/16341467

CLIENT端

  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 != 5))
  10. {
  11. cout<<"Usage: appclient.exe client_port server_ip server_port local_filename"<<endl;
  12. return 0;
  13. }
  14. //startup
  15. if (UDT::ERROR == UDT::startup())
  16. {
  17. cout<<"startup: "<<UDT::getlasterror().getErrorMessage()<<endl;
  18. }else{
  19. cout<<"startup suc..."<<endl;
  20. }
  21. //Initialize the UDT library
  22. UDTSOCKET client = UDT::socket(AF_INET, SOCK_DGRAM, 0);
  23. if (UDT::ERROR == client)
  24. {
  25. cout<<"socket: "<<UDT::getlasterror().getErrorMessage()<<endl;
  26. }else{
  27. cout<<"client suc..."<<endl;
  28. }
  29. //声明udp socket
  30. int clientsocket = socket(AF_INET,SOCK_DGRAM,0);
  31. if (SOCKET_ERROR == clientsocket)
  32. {
  33. cout<<"udp socket error!"<<endl;
  34. }else{
  35. cout<<"clientsocket suc..."<<endl;
  36. }
  37. sockaddr_in serv_addr,my_addr;
  38. serv_addr.sin_family = AF_INET;
  39. serv_addr.sin_port = htons(atoi(argv[3]));
  40. serv_addr.sin_addr.s_addr = inet_addr(argv[2]);
  41. memset(&(serv_addr.sin_zero), '\0', 8);
  42. my_addr.sin_family = AF_INET;
  43. my_addr.sin_port = htons(atoi(argv[1]));
  44. my_addr.sin_addr.s_addr = INADDR_ANY;
  45. memset(&(my_addr.sin_zero), '\0', 8);
  46. bind(clientsocket,(struct sockaddr*)&my_addr,sizeof(my_addr));
  47. int mss = 1052;//最大传输单位
  48. //设置收发缓冲区大小 接收限时  和地址重用
  49. if(   !( UDT::ERROR != (UDT::setsockopt(client, 0, UDT_SNDBUF, new int(32000), sizeof(int)))
  50. && UDT::ERROR != (UDT::setsockopt(client, 0, UDP_RCVBUF, new int(32000), sizeof(int)))
  51. && UDT::ERROR != (UDT::setsockopt(client,0,UDT_REUSEADDR,new int(1),sizeof(int)))
  52. && UDT::ERROR != (UDT::setsockopt(client, 0, UDT_RENDEZVOUS, new bool(true), sizeof(bool))))
  53. && UDT::ERROR != (UDT::setsockopt(client, 0, UDT_MSS, &mss, sizeof(int))))
  54. {
  55. cout<<"udt socket: "<<UDT::getlasterror().getErrorMessage()<<endl;
  56. UDT::close(client);
  57. return 0;
  58. }
  59. if (UDT::ERROR == UDT::bind2(client,clientsocket))
  60. {
  61. cout<<"udt bind2:"<<UDT::getlasterror().getErrorMessage()<<endl;
  62. return 0;
  63. }else{
  64. cout<<"bind2 suc"<<endl;
  65. }
  66. // connect to the server, implict bind
  67. if (UDT::ERROR == UDT::connect(client, (sockaddr*)&serv_addr, sizeof(serv_addr)))
  68. {
  69. cout << "connect: " << UDT::getlasterror().getErrorMessage();
  70. UDT::close(client);
  71. return 0;
  72. }else{
  73. cout<<"connect suc"<<endl;
  74. }
  75. char* hello = argv[4];
  76. if (UDT::ERROR == UDT::sendmsg(client, hello, strlen(hello) + 1,-1,true))
  77. {
  78. cout << "send: " << UDT::getlasterror().getErrorMessage();
  79. return 0;
  80. }
  81. FILE *fp;
  82. fp = fopen(hello,"rb");
  83. fseek(fp,0,SEEK_END);
  84. int filesize = ftell(fp);
  85. //rewind(fp);//移动到头部
  86. fseek(fp,0,SEEK_SET);
  87. static int filepos = 0;//记录文件偏移量
  88. cout<<"filesize = "<<filesize<<endl;
  89. char data[MAXLEN+1];
  90. int len=0,package=0;
  91. UDT::TRACEINFO trace;
  92. UDT::perfmon(client,&trace);
  93. while(1)
  94. {
  95. memset(data,0,sizeof(data));
  96. fread(data,MAXLEN,1,fp);
  97. if(filesize>=MAXLEN)
  98. {
  99. len = UDT::sendmsg(client,data,MAXLEN,-1,true);
  100. if (len<0)
  101. {
  102. cout<<"send failure!!\n"<<endl;
  103. break;
  104. }
  105. filesize -= MAXLEN;
  106. package ++;//record send all the packages
  107. }else
  108. {
  109. len = UDT::sendmsg(client,data,filesize,-1,true);
  110. if (len<0)
  111. {
  112. cout<<"send failure!!\n"<<endl;
  113. break;
  114. }
  115. package ++;//record recv all the packages
  116. char *quit = "quit";
  117. if (UDT::ERROR == UDT::sendmsg(client,quit,strlen(quit)+1,-1,true))
  118. {
  119. cout<<"send quit error"<<endl;
  120. fclose(fp);
  121. break;
  122. }
  123. break;
  124. }
  125. }
  126. UDT::perfmon(client,&trace);
  127. cout << "speed = " << trace.mbpsSendRate << "Mbits/sec" << endl;
  128. cout<<"send all the packages: "<<package<<endl;
  129. fclose(fp);
  130. UDT::close(client);
  131. UDT::close(clientsocket);
  132. UDT::cleanup();
  133. return 1;
  134. }

运行效果图:

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

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

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

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

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

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

  3. 基于序列化技术(Protobuf)的socket文件传输

    好像好久都没更博文了,没办法,最近各种倒霉事情,搞到最近真的没什么心情,希望之后能够转运吧. 言归正传,这次我要做的是基于序列化技术的socket文件传输来无聊练一下手. 一.socket文件传输 之 ...

  4. Linux虚拟机与主机网络连接配置与文件传输

    网络配置 对于VMware虚拟机 1. 设置linux系统的网络配置,如下(NAT为默认配置,这里采用这一配置) 2. 主机中配置本地连接-属性-共享-勾选红框配置项,如下:     3.重启虚拟机. ...

  5. Xshell远程连接 与 Xftp文件传输

    刚开始接触Linux的时候,会想我该怎么在Windows连接到另一台Linux服务器,怎么把我Windows上的文件放到我Linux上面,网上搜索之后,知道可以用Xshell远程连接到Linux,用X ...

  6. python基于并发与socket实现远程文件传输程序

    FTP程序 Client: * bin/start.py 程序入口 * conf/配置文件存放 * core/ * auth.py 登陆,注册以及上传下载查看当前文件夹下文件以及删除功能存放 * cl ...

  7. Hi3516开发笔记(二):Hi3516虚拟机基础环境搭建之串口调试、网络连接以及sftp文件传输

    前言   搭建Hi3516的基础虚拟机,为交叉编译环境搭建前期工作.后续会编译一个基本的C语言程序Demo,在HI3516上跑.   虚拟机   开发本对虚拟机做了一些基本要求,如下图:    其实重 ...

  8. Tftp文件传输服务器(基于UDP协议)

    一个简单的UDP服务端与客户端 服务端: from socket import * #创建套接字 udp_server = socket(AF_INET,SOCK_DGRAM) msg_server ...

  9. QT从入门到入土(九)——TCP/IP网络通信(以及文件传输)

    引言 TCP/IP通信(即SOCKET通信)是通过网线将服务器Server端和客户机Client端进行连接,在遵循ISO/OSI模型的四层层级构架的基础上通过TCP/IP协议建立的通讯.控制器可以设置 ...

随机推荐

  1. 【转帖】LoadRunner系统架构简介

    LoadRunner系统架构简介: LoadRunner是通过创建虚拟用户来代替真实实际用户来操作客户端软件比如Internet Explorer,来向IIS.Apache等Web服务器发送HTTP协 ...

  2. windows禁用/启用hyper-V,解决hyper-V与模拟器同时启用时造成冲突

  3. 深入理解Angular2变化监测和ngZone

    转载自GitHub JTangming : https://github.com/JTangming/tm/issues/4 Angular应用程序通过组件实例和模板之间进行数据交互,也就是将组件的数 ...

  4. laravel - ReflectionException in Container.php, Class not found?

    SIGN UPSIGN IN CATALOG SERIES PODCAST DISCUSSIONS ReflectionException in Container.php, Class not fo ...

  5. laravel5.5容器

    目录 1. 比较典型的例子就是 cache 缓存 2. 容器顾名思义,其实就是完成存取过程 2.1 绑定过程 简单绑定 绑定单例 绑定实例 绑定初始数据 2.2 解析过程 容器主要是为了实现控制反转, ...

  6. MySQL数据库基础总结

    来源: 实验楼 链接: https://www.shiyanlou.com/courses/9 一.开发准备 # 打开 MySQL 服务 sudo service mysql start #使用 ro ...

  7. [转]ANDROID JNI之JAVA域与c域的互操作

    本文讲述AndroidJava域与C域互操作:Java域调用c域的函数:c域访问Java域的属性和方法:c域生成的对象的保存与使用.重点讲解c域如何访问Java域. 虽然AndroidJNI实现中,c ...

  8. grunt简记

    grunt和gulp都是前端自动化的工具,grunt更成熟,插件社区全.大:gulp比较年轻,性能更好,更简单容易.具体使用哪种可根据实际项目组来决定. 创建任务 grunt默认执行的是default ...

  9. CSS3 3D圆形设计教程

    http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201502061338.html

  10. [转]赵桐正thinkphp教程笔记

    原文:赵桐正thinkphp教程笔记 ,有修改 常用配置 常用配置config.php: <?php return array( //'配置项'=>'配置值' 'URL_PATHINFO_ ...