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

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

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

CLIENT端

[cpp] view plain copy

  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

简单截图如下:

时间: 2024-11-06 14:08:30

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

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

网上与UDT相关的资料不多,与UDT相关的源码例子更少.最近在接触UDT,也是因为缺少相关的资料,导致学习起来甚感痛苦.下面将我自己这两天弄出来的代码贴出来,希望对在寻找相关资料的童鞋有一定的帮助.与服务端相对应的客户端在另一篇博文中 [cpp] view plain copy SERVER端 [cpp] view plain copy #include <iostream> #include "udt.h" #include <io.h> #pragma co

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

1.在百度云盘存有此工具,获取到后解压执行即可,如下2 2.secureCRT连接服务器和文件传输 ,现象如下 登录后切换到root用户即可有权限操作   su - 原文地址:https://www.cnblogs.com/yoyoblogs/p/11237036.html

一个重绘MFC的文件传输客户端

 一个重绘MFC的文件传输客户端,TCP/IP协议的文件传输客户端(支持上传.下载.续传.管理等功能,本处只选择了上传功能),从用户视觉上看,肯定比原生MFC界面要有感觉,啥也不说了,直接上图. 这个客户端界面,是从过浏览器通过ActiveX控件机制激活的,并且把文件传输任务传递给客户端的. (初始界面) (配置窗口) (锁屏对话框) (传输设置,还有很多配置,本次被省略了) (正在上传,右键菜单灵活多变) (上传完成) (回收站) 一个重绘MFC的文件传输客户端,布布扣,bubuko.co

基于smack的即时聊天系统之文件传输功能实现

功能实现流程为: 1.文件发送方用户登录 2.确定文件的接收方和待发送文件路径 3.获取连接 4.根据连接获取文件接收方的完整jid(例如[email protected]/MiniQQ 2.3.6),其中MiniQQ 2.3.6为文件接收方用户客户端的resource,必须获取到,否则文件无法发送 5.发送文件 实现代码为: <span style="font-size:18px;">public int TransFile(String toUser, String f

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

一个简单的UDP服务端与客户端 服务端: 1 from socket import * 2 #创建套接字 3 udp_server = socket(AF_INET,SOCK_DGRAM) 4 5 msg_server = ("",8877) 6 #绑定ip地址和端口 7 udp_server.bind(msg_server) 8 9 while True: 10 #接受消息,注意此处用的是 recvfrom() 11 msg_client = udp_server.recvfrom(

基于Spring支持的通信

概述 基于Spring支持的客户端编程,包括发送方客户端.接收方客户端. 发送方客户端代码:jms-producer 接收方客户端代码:jms-consumer 本文有pdf版本:基于Spring支持的通信.pdf 发送方客户端 这里基于demo进行说明.这个demo将往example.queue和example.topic各发一条信息. 文件目录结构 1 src/main/resources/ 2 |---- jndi.properties 3 |---- spring-beans.xml 4

分析下Neworkcomms中的文件传输

文件传输在客户端,服务器端程序的应用是非常广泛的,稳定的文件传输应该可以说是Tcp通讯的核心功能.下面我们来看一下如何基于networkcomms2.3.1来进行文件传输.最新的 v3版本做了一些加强,变化不是很大. 使用networkcomms2.3.1框架,您无需考虑粘包等问题,框架已经帮您处理好了. 我们看一下如何发送文件,相关代码如下: 发送文件: public void StartSendFile() { //声明一个文件流 FileStream stream = null; try

Windows下基于TCP协议的大文件传输(流形式)

简单实现TCP下的大文件高效传输 在TCP下进行大文件传输,不像小文件那样直接打包个BUFFER发送出去,因为文件比较大可能是1G,2G或更大,第一效率问题,第二TCP粘包问题.针对服务端的设计来说就更需要严紧些.下面介绍简单地实现大文件在TCP的传输应用. 粘包出现原因:在流传输中出现,UDP不会出现粘包,因为它有消息边界(参考Windows 网络编程) 1 发送端需要等缓冲区满才发送出去,造成粘包 2 接收方不及时接收缓冲区的包,造成多个包接收 解决办法: 为了避免粘包现象,可采取以下几种措

基于文件传输的UDP协议分析(1)

网络通信与数据交换已经成为现代软件必备的基础功能. 目前公司上下位机的网络通信均采用TCP/ UDP协议进行数据交换和控制.这种低层次的网络通信协议在小数据量,少互交的领域有着较大的优势.但是随着网络功能需求的日趋旺盛,TCP/UDP协议日渐无法满足需求,其弊端日渐明显 *TCP/UDP通信编程可分为: 1  通信控制层 通信控制层负责网络的配置,连接,发送数据, 接受数据响应, 中断等服务 2数据处理层 数据处理层主要负责数据的封包,解包,校验等工      作.简称: "数据协议的程序化过程