基于UDT connect连接通信以及文件传输--客户端
上面一篇文章中提出了服务端的,其实这里没有严格意义的服务端和客户端之分,因为我在代码中是基于UDP的,不存在服务端与客户端,两个都是对等的,只是我这里进行一下简单的区分而已。在这里,客户端所进行的主要操作就是首先给服务端发送文件名,然后将文件直接通过fopen(),fread()等一系列的操作将文件发送过去。
与客户端相对应的源码在另一篇博文中:http://blog.csdn.net/pingd/article/details/16341467
CLIENT端
- #include <iostream>
- #include "udt.h"
- #include <io.h>
- #pragma comment(lib,"ws2_32.lib")
- using namespace std;
- #define MAXLEN 4096
- int main(int argc,char *argv[])
- {
- if ((argc != 5))
- {
- cout<<"Usage: appclient.exe client_port server_ip server_port local_filename"<<endl;
- return 0;
- }
- //startup
- if (UDT::ERROR == UDT::startup())
- {
- cout<<"startup: "<<UDT::getlasterror().getErrorMessage()<<endl;
- }else{
- cout<<"startup suc..."<<endl;
- }
- //Initialize the UDT library
- UDTSOCKET client = UDT::socket(AF_INET, SOCK_DGRAM, 0);
- if (UDT::ERROR == client)
- {
- cout<<"socket: "<<UDT::getlasterror().getErrorMessage()<<endl;
- }else{
- cout<<"client suc..."<<endl;
- }
- //声明udp socket
- int clientsocket = socket(AF_INET,SOCK_DGRAM,0);
- if (SOCKET_ERROR == clientsocket)
- {
- cout<<"udp socket error!"<<endl;
- }else{
- cout<<"clientsocket suc..."<<endl;
- }
- sockaddr_in serv_addr,my_addr;
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_port = htons(atoi(argv[3]));
- serv_addr.sin_addr.s_addr = inet_addr(argv[2]);
- memset(&(serv_addr.sin_zero), '\0', 8);
- my_addr.sin_family = AF_INET;
- my_addr.sin_port = htons(atoi(argv[1]));
- my_addr.sin_addr.s_addr = INADDR_ANY;
- memset(&(my_addr.sin_zero), '\0', 8);
- bind(clientsocket,(struct sockaddr*)&my_addr,sizeof(my_addr));
- int mss = 1052;//最大传输单位
- //设置收发缓冲区大小 接收限时 和地址重用
- if( !( UDT::ERROR != (UDT::setsockopt(client, 0, UDT_SNDBUF, new int(32000), sizeof(int)))
- && UDT::ERROR != (UDT::setsockopt(client, 0, UDP_RCVBUF, new int(32000), sizeof(int)))
- && UDT::ERROR != (UDT::setsockopt(client,0,UDT_REUSEADDR,new int(1),sizeof(int)))
- && UDT::ERROR != (UDT::setsockopt(client, 0, UDT_RENDEZVOUS, new bool(true), sizeof(bool))))
- && UDT::ERROR != (UDT::setsockopt(client, 0, UDT_MSS, &mss, sizeof(int))))
- {
- cout<<"udt socket: "<<UDT::getlasterror().getErrorMessage()<<endl;
- UDT::close(client);
- return 0;
- }
- if (UDT::ERROR == UDT::bind2(client,clientsocket))
- {
- cout<<"udt bind2:"<<UDT::getlasterror().getErrorMessage()<<endl;
- return 0;
- }else{
- cout<<"bind2 suc"<<endl;
- }
- // connect to the server, implict bind
- if (UDT::ERROR == UDT::connect(client, (sockaddr*)&serv_addr, sizeof(serv_addr)))
- {
- cout << "connect: " << UDT::getlasterror().getErrorMessage();
- UDT::close(client);
- return 0;
- }else{
- cout<<"connect suc"<<endl;
- }
- char* hello = argv[4];
- if (UDT::ERROR == UDT::sendmsg(client, hello, strlen(hello) + 1,-1,true))
- {
- cout << "send: " << UDT::getlasterror().getErrorMessage();
- return 0;
- }
- FILE *fp;
- fp = fopen(hello,"rb");
- fseek(fp,0,SEEK_END);
- int filesize = ftell(fp);
- //rewind(fp);//移动到头部
- fseek(fp,0,SEEK_SET);
- static int filepos = 0;//记录文件偏移量
- cout<<"filesize = "<<filesize<<endl;
- char data[MAXLEN+1];
- int len=0,package=0;
- UDT::TRACEINFO trace;
- UDT::perfmon(client,&trace);
- while(1)
- {
- memset(data,0,sizeof(data));
- fread(data,MAXLEN,1,fp);
- if(filesize>=MAXLEN)
- {
- len = UDT::sendmsg(client,data,MAXLEN,-1,true);
- if (len<0)
- {
- cout<<"send failure!!\n"<<endl;
- break;
- }
- filesize -= MAXLEN;
- package ++;//record send all the packages
- }else
- {
- len = UDT::sendmsg(client,data,filesize,-1,true);
- if (len<0)
- {
- cout<<"send failure!!\n"<<endl;
- break;
- }
- package ++;//record recv all the packages
- char *quit = "quit";
- if (UDT::ERROR == UDT::sendmsg(client,quit,strlen(quit)+1,-1,true))
- {
- cout<<"send quit error"<<endl;
- fclose(fp);
- break;
- }
- break;
- }
- }
- UDT::perfmon(client,&trace);
- cout << "speed = " << trace.mbpsSendRate << "Mbits/sec" << endl;
- cout<<"send all the packages: "<<package<<endl;
- fclose(fp);
- UDT::close(client);
- UDT::close(clientsocket);
- UDT::cleanup();
- return 1;
- }
运行效果图:
基于UDT connect连接通信以及文件传输--客户端的更多相关文章
- 基于UDT connect连接通信以及文件传输--服务端
网上与UDT相关的资料不多,与UDT相关的源码例子更少.最近在接触UDT,也是因为缺少相关的资料,导致学习起来甚感痛苦.下面将我自己这两天弄出来的代码贴出来,希望对在寻找相关资料的童鞋有一定的帮助.与 ...
- secureCRT连接服务器和文件传输( 一步搞定)
1.在百度云盘存有此工具,获取到后解压执行即可,如下2 连接目标服务器 192.xxx.xx.xx 2.secureCRT连接服务器和文件传输 ,现象如下 登录后切换到root用户即可有权限操作 ...
- 基于序列化技术(Protobuf)的socket文件传输
好像好久都没更博文了,没办法,最近各种倒霉事情,搞到最近真的没什么心情,希望之后能够转运吧. 言归正传,这次我要做的是基于序列化技术的socket文件传输来无聊练一下手. 一.socket文件传输 之 ...
- Linux虚拟机与主机网络连接配置与文件传输
网络配置 对于VMware虚拟机 1. 设置linux系统的网络配置,如下(NAT为默认配置,这里采用这一配置) 2. 主机中配置本地连接-属性-共享-勾选红框配置项,如下: 3.重启虚拟机. ...
- Xshell远程连接 与 Xftp文件传输
刚开始接触Linux的时候,会想我该怎么在Windows连接到另一台Linux服务器,怎么把我Windows上的文件放到我Linux上面,网上搜索之后,知道可以用Xshell远程连接到Linux,用X ...
- python基于并发与socket实现远程文件传输程序
FTP程序 Client: * bin/start.py 程序入口 * conf/配置文件存放 * core/ * auth.py 登陆,注册以及上传下载查看当前文件夹下文件以及删除功能存放 * cl ...
- Hi3516开发笔记(二):Hi3516虚拟机基础环境搭建之串口调试、网络连接以及sftp文件传输
前言 搭建Hi3516的基础虚拟机,为交叉编译环境搭建前期工作.后续会编译一个基本的C语言程序Demo,在HI3516上跑. 虚拟机 开发本对虚拟机做了一些基本要求,如下图: 其实重 ...
- Tftp文件传输服务器(基于UDP协议)
一个简单的UDP服务端与客户端 服务端: from socket import * #创建套接字 udp_server = socket(AF_INET,SOCK_DGRAM) msg_server ...
- QT从入门到入土(九)——TCP/IP网络通信(以及文件传输)
引言 TCP/IP通信(即SOCKET通信)是通过网线将服务器Server端和客户机Client端进行连接,在遵循ISO/OSI模型的四层层级构架的基础上通过TCP/IP协议建立的通讯.控制器可以设置 ...
随机推荐
- Docker构建nginx+uwsgi+flask镜像(二)
Dockerfile搭建环境并打包应用 在上一章Docker构建nginx+uwsgi+flask镜像(一)的学习中,我们学会用命令行一句一句在alpine环境中搭建nginx+uwsgi+flask ...
- 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(二)
本文导航 -7. 安装 PHP0 -8. 安装 MariaDB 数据库 -9. 安装和配置 SSH 服务器 -10. 安装 GCC (GNU 编译器集) -11. 安装 Java 7. 安装 PHP ...
- Hadoop学习笔记系列
Hadoop学习笔记系列 一.为何要学习Hadoop? 这是一个信息爆炸的时代.经过数十年的积累,很多企业都聚集了大量的数据.这些数据也是企业的核心财富之一,怎样从累积的数据里寻找价值,变废为宝炼 ...
- 程序员必备PC维修法(硬件篇)
自检自修不是万能,但不会自检自修却万万不能.程序员修电脑还是有必要的. 情景:通电情况下,电脑主机无法启动,所有主机内部硬件无反应. 原因:1.CPU.主板.电源积尘.(出现率30%) 2.CPU.主 ...
- ADB命令总结(1)
今日继续学习ADB,使用真机来操作,因此把所用到的命令总结如下: 一,模拟按HOME键 adb shell input keyevent KEYCODE_HOME 二,滑动手机屏幕 从(x1,y1)滑 ...
- 【转载】Unity3D研究院之IOS&Andoird使用Sharesdk遇到的坑
这两天研究了一下ShareSDK,说实话挺好用的,但是还是有点坑的地方.那么雨松MOMO写下博文记录一下来我遇到的坑,嘿嘿. 大部分内容它的文档上已经说的很清楚了. http://wiki.share ...
- (原) Unreal创建自定义MeshCompoent
@author:白袍小道 随缘查看 前言: 绘制相关类 MeshCompoent 模型组件 FVertexBuffer 顶点缓冲区封装 FIndexBuffer 顶点索引缓冲区封装 FRHIResou ...
- Ubuntu系列问题
一.Ubuntu16.04 intel_rapl : no valid rapl domains found in packge0 echo 'blacklist intel_rapl' >&g ...
- python作业:模拟登陆(第一周)
模拟登陆作业需求: 1. 用户输入帐号密码进行登陆 2. 用户信息保存在文件内 3. 用户密码输入错误三次后锁定用户 额外实现功能: 1.提示输入错误次数 2.输入已锁定用户会提示 3.用户不存在会提 ...
- php session访问限制
登录 <?php // 启动会话 session_start(); // 注册登陆成功的 admin 变量,并赋值 true $_SESSION["admin"] = tru ...