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

运行效果图:

 

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

简单截图如下:

时间: 2025-01-21 19:55:12

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

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

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

JFtp 1.56发布 文件传输客户端

JFtp 是一个Swing Java网络和文件传输客户​​端.其功能是支持FTP,其他各种协议,如:SMB,SFTP,NFS,HTTP和使用第三方的APIs进行文件传输.它还包括多个高级的功能,如递归目录上传/下载,浏览FTP服务器传输文件,浏览局域网Windows共享资源,等等. JFtp 1.5该版本增加了由操作系统提供的应用程序打开本地文件的能力,提供更好的传输按钮,并删除一些旧的代码. 软件信息:http://sourceforge.net/projects/j-ftp/ 下载地址:ht

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

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

win32 tcp文件传输客户端

#include<stdio.h> #include <stdlib.h> #include <winsock2.h> #include <string.h> #pragma comment(lib,"ws2_32.lib") #define PORT 9999 #define IPADDR "127.0.0.1" #define BACKLOG 20 #define FILENAME 200 #define LENG

win 32下c语言文件传输客户端1.23

#include <stdio.h> #include <windows.h> //#include <winsock2.h> #include <stdlib.h> #pragma comment(lib, "ws2_32.lib") int main(int argc, char *argv[]) { WSADATA wsadata; WSAStartup(MAKEWORD(2,0),&wsadata); unsigned s

一种Jingle开源库的文件传输原理与实现

随着即时通信(IM)软件已经成为互联网信息平台的重要组成部分[4].但基于自身利益的考虑,各个IM软件均制定并保守自己支持的通信协议格式和标准,导致了各个通信软件不能互联互通,客观上制约了IM的发展. XMPP协议标准解决了不同即时通信平台信息互通的难题.基于XMPP扩展P2P协议的应用开源库libjingle库可以开发第三方IM软件,最终实现第三方IM与支持XMPP协议的即时通信软件的文本和语音等的互操作. 本文以libjingle为研究对象,重点讨论libjingle支持的文件传输的实现原理

嵌入式arm linux蓝牙文件传输移植

嵌入式arm linux蓝牙文件传输移植目前,蓝牙技术已经比较成熟,特别是基于手机和PC得蓝牙文件传输. 本文主要讲述基于嵌入式arm linux的蓝牙文件传输.    现行2.6.x的linux内核都已经集成了bluez蓝牙驱动,对于2.4版本内核的需要到bluez官方网站下载并安装bluez蓝牙驱动.http://www.bluez.org/download/    本为基于2.6版本的内核讲述.对于2.4下载bluez后安装即可.有了bluez蓝牙驱动还需要安装bluez-libs库和bl

解密普元大文件传输核心技术

本文讲的是解密普元大文件传输核心技术,提起文件数据的传输功能,文件如何传输,如何保障传输的可靠性,不会出现数据错乱等问题是客户最为关心的问题.普元作为国内领先的软件基础平台与解决方案提供商,在这篇文章里,我将会和大家从架构和技术两个方面解密我所在职的这家公司产品家族中的大文件传输技术. 本文目录: 一.文件传输高可用架构 二.传输会话的控制 三.如何保障文件传输安全可靠 四.总结 一.文件传输高可用架构 大文件传输采用分布式的架构,它包括了三个重要的组成部分:BFT Agent,BFT Serv

Python实现的简单文件传输服务器和客户端_python

还是那个题目(题目和流程见java版本),感觉光用java写一点新意也没有,恰巧刚学习了python,何不拿来一用,呵呵: 服务器端: import SocketServer, time class MyServer(SocketServer.BaseRequestHandler): userInfo = { 'yangsq' : 'yangsq', 'hudeyong' : 'hudeyong', 'mudan' : 'mudan' } def handle(self): print 'Con