• 基于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), '', 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), '', 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!! "<<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!! "<<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
    简单截图如下:
  • 相关阅读:
    201671010461张仲桃 实验三
    通读《构建之法》之后的问题
    201671010402-陈靖 实验十四 团队项目评审&课程学习总结
    201671010402-陈靖 实验四附加实验
    201671010402-陈靖——英文文本统计分析》结对项目报告
    201671010402 词频统计软件项目报告
    201671010402-陈靖 实验三 作业互评与改进
    读《现代软件工程——构建之法》所遇到的问题
    201671010403 陈倩倩 实验十四 团队项目评审&课程学习总结
    201671010403 陈倩倩 实验四附加实验
  • 原文地址:https://www.cnblogs.com/lidabo/p/6846649.html
Copyright © 2020-2023  润新知