上面一篇文章中提出了服务端的,其实这里没有严格意义的服务端和客户端之分,因为我在代码中是基于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. 探究SynchronizationContext在.Net异步编程中的地位

    原文:探究SynchronizationContext在.Net异步编程中的地位 引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供Task线程包装类和await/a ...

  2. 跨域携带cookie

    $.ajax({ type: "GET", url: "https://upload.cnblogs.com/imageuploader/upload?host=www. ...

  3. PAT、PMT、SDT详解

    下面针对解复用程序详细分析一下PAT,PMT和SDT三类表格的格式. 如下图,四个频道复用 PAT---Program Association Table,节目关联表 .PAT表携带以下信息: (1) ...

  4. nohup 重定向的问题-- 费元星 站长

    费元星 大牛 以前只知道使用nohup可以让一个程序后台执行,但是生成的日志文件都放到nohup.out中了,不能自己指定,尤其是在同一个目录下我需要让两个甚至多个程序都要后台执行时,这样看日志就比较 ...

  5. elasticsearch安装教程

    目录 1 java8 环境 2 安装elasticsearch 3 安装kibana 4. 单服务器部署多个节点 参考: 1 java8 环境 elasticsearch需要安装java 8 环境,配 ...

  6. 修改window 10 开始菜单问题

    cmd->powershell Get-AppxPackage | % { Add-AppxPackage -DisableDevelopmentMode -Register "$($ ...

  7. python-成员修饰符

    python的面相对象中,拥有3个成员,字段.方法.属性 class Foo: def __init__(self,name): #公有字段name在类中与类外均能调用 self.name = nam ...

  8. [译]12-spring依赖注入

    每个java应用程序都是由多个类协作才最终生成了终端用户所使用的系统.当编写复杂java应用程序的时,类之间应尽 可能保持独立,因为这样更容易做到代码的重用,也有利于单元测试的开展.spring的依赖 ...

  9. ironic images

    参考: http://blog.csdn.net/wanghuiict/article/details/52757359 ironic 整个部署流程中有两组映像,分别是 deploy 映像和 user ...

  10. CodeSimth - .Net Framework Data Provider 可能没有安装。解决方法[转载 ]

    原文:http://www.cnblogs.com/chenrui7/p/3592082.html 今天想使用CodeSimth生成一个sqlite数据库的模板.当添加添加数据库的时候发现: .Net ...