基于UDT connect连接通信以及文件传输--服务端
网上与UDT相关的资料不多,与UDT相关的源码例子更少。最近在接触UDT,也是因为缺少相关的资料,导致学习起来甚感痛苦。下面将我自己这两天弄出来的代码贴出来,希望对在寻找相关资料的童鞋有一定的帮助。与服务端相对应的客户端在另一篇博文中
SERVER端
- #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 != 4))
- {
- cout<<"Use: appserver.exe server_port client_ip client_port"<<endl;
- return 0;
- }
- //startup
- //这里是对UDT的启动记性初始化操作
- if (UDT::ERROR == UDT::startup())
- {
- cout<<"startup: "<<UDT::getlasterror().getErrorMessage()<<endl;
- }else{
- cout<<"startup suc..."<<endl;
- }
- //socket
- //像声明一个普通的socket一样声明一个UDTSOCKET
- UDTSOCKET serv = UDT::socket(AF_INET, SOCK_DGRAM, 0);
- if (UDT::ERROR == serv)
- {
- cout<<"socket: "<<UDT::getlasterror().getErrorMessage()<<endl;
- }else{
- cout<<"client suc..."<<endl;
- }
- //声明udp socket,这里是udp的哈,不是udt
- int sersocket = socket(AF_INET,SOCK_DGRAM,0);
- if (SOCKET_ERROR == sersocket)
- {
- cout<<"udp socket error!"<<endl;
- }else{
- cout<<"clientsocket suc..."<<endl;
- }
- //为了能够在局域网中直接进行处理,先默认设置两个
- sockaddr_in my_addr,client_addr;
- 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(sersocket,(struct sockaddr*)&my_addr,sizeof(my_addr));
- client_addr.sin_family = AF_INET;
- client_addr.sin_port = htons(atoi(argv[3]));
- client_addr.sin_addr.s_addr = inet_addr(argv[2]);
- //client_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
- memset(&(client_addr.sin_zero), '\0', 8);
- int mss = 1052;//最大传输单位
- //设置收发缓冲区大小 接收限时 和地址重用
- if( !( UDT::ERROR != (UDT::setsockopt(serv, 0, UDT_SNDBUF, new int(32000), sizeof(int)))
- && UDT::ERROR != (UDT::setsockopt(serv, 0, UDP_RCVBUF, new int(32000), sizeof(int)))
- && UDT::ERROR != (UDT::setsockopt(serv,0,UDT_REUSEADDR,new int(1),sizeof(int)))
- && UDT::ERROR != (UDT::setsockopt(serv, 0, UDT_RENDEZVOUS, new bool(true), sizeof(bool))))
- && UDT::ERROR != (UDT::setsockopt(serv, 0, UDT_MSS, &mss, sizeof(int)) ))
- {
- cout<<"udt socket: "<<UDT::getlasterror().getErrorMessage()<<endl;
- UDT::close(serv);
- return 0;
- }
- //这里是直接将udp的接口绑定在udt的接口之上,如果不这样做的话是没法使用UDT中的SOCK_DGRAM的
- if (UDT::ERROR == UDT::bind2(serv,sersocket))
- {
- cout<<"udt bind2:"<<UDT::getlasterror().getErrorMessage()<<endl;
- return 0;
- }else{
- cout<<"bind2 suc"<<endl;
- }
- //这里也是关键部分,与client端对应的connect操作,就是相互之间的打洞处理
- if (UDT::ERROR == UDT::connect(serv, (sockaddr*)&client_addr, sizeof(client_addr)))
- {
- cout << "connect: " << UDT::getlasterror().getErrorMessage();
- UDT::close(serv);
- return 0;
- }else{
- cout<<"connetc suc"<<endl;
- }
- //这里已经可以正常接收了,接收从client发过来的filename,目的是用于本地的文件创建
- char filename[100];
- if (UDT::ERROR == UDT::recvmsg(serv, filename, 100))
- {
- cout << "recv:" << UDT::getlasterror().getErrorMessage() << endl;
- return 0;
- }
- cout <<"filename: "<< filename <<endl;
- //使用FILE进行文件操作,关于文件的相关操作这里不详述了,实在不懂的可以留言
- FILE *fp;
- char localfile[100];
- memset(localfile,0,sizeof(localfile));
- strcpy(localfile,"d:\\");
- strcat(localfile,filename);
- if((fp = fopen(localfile,"w+"))==NULL)
- {
- cout<<filename<<" open failure!"<<endl;
- return 0;
- }
- fclose(fp);
- fp = fopen(localfile,"wb");
- char data[MAXLEN];
- int len=0,package=0,filelen=0;
- UDT::TRACEINFO trace;
- UDT::perfmon(serv,&trace);
- while(1)
- {
- //前面部分打开文件后,这里就是循环接收文件并保存
- memset(data,0,sizeof(data));
- len = UDT::recvmsg(serv, data, MAXLEN);
- filelen += len;
- //cout<<"filelen = "<<filelen<<endl;
- if (strncmp("quit",data,4)==0)
- {
- cout<<data<<endl;
- fclose(fp);
- break;
- }else
- {
- package ++;//record recv all the packages
- }
- fwrite(data,len,1,fp);
- }
- fclose(fp);
- fp = fopen(localfile,"rb");
- fseek(fp,0,SEEK_END);//move to the end
- filelen = ftell(fp)
- fseek(fp,0,SEEK_SET);
- cout<<"filesize = "<<filelen<<endl;
- UDT::perfmon(serv,&trace);
- cout << "speed = " << trace.mbpsRecvRate << "Mbits/sec" << endl;
- cout<<"recv all the packages: "<<package<<endl;
- fclose(fp);
- UDT::close(serv);
- UDT::cleanup();
- return 1;
- }
运行效果截图:
基于UDT connect连接通信以及文件传输--服务端的更多相关文章
- 基于UDT connect连接通信以及文件传输--客户端
上面一篇文章中提出了服务端的,其实这里没有严格意义的服务端和客户端之分,因为我在代码中是基于UDP的,不存在服务端与客户端,两个都是对等的,只是我这里进行一下简单的区分而已.在这里,客户端所进行的主要 ...
- secureCRT连接服务器和文件传输( 一步搞定)
1.在百度云盘存有此工具,获取到后解压执行即可,如下2 连接目标服务器 192.xxx.xx.xx 2.secureCRT连接服务器和文件传输 ,现象如下 登录后切换到root用户即可有权限操作 ...
- WCF大文件传输服务
由于项目需要,自己写一个基于WCF的大文件传输服务雏形.觉得有一定的参考价值,因此放在网上分享. 目前版本为v1.1特点如下: 1.文件传输端口为18650 2.上传和下载文件 3.支持获取文件传输状 ...
- FTP文件传输服务
FTP文件传输服务 一 .FTP 连接及传输的模式 l 控制连接:TCP21,用于发送FTP命令信息. l 数据连接:TCP 20, 用于上传下载数据. · 数据连接建立的类型: ·主动模式: 服 ...
- Python自带HTTP文件传输服务
一行命令搭建一个基于python的http文件传输服务 由于今天朋友想要一个文件,而我恰好有,因为这个文件比较大,网速不是很给力,所以想到了python自己有这么一个功能,这样不仅不需要下载其他软件, ...
- 网站优化与Cdn文件传输服务
网站优化与Cdn文件传输服务 如今互联网无处不在,其方便快捷.性质和低成本的经济特点,已经逐渐成为商务贸易.信息分发和数据交付的一个重要渠道.要想让数据的分发带来巨大的效益,那么网民的满意是唯一的办法 ...
- FTP 文件传输服务
昨晚心血来潮,尝试用python写了一个ftp文件传输服务,可以接收指令,从远程ftp服务器同步指定目录数据,最后没用上,开源出来. https://github.com/jadepeng/ftp_t ...
- httpurlconnection发送文件到服务端并接收
httpurlconnection发送文件到服务端并接收 客户端 import java.io.DataInputStream; import java.io.File; import java.io ...
- 部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用
前面介绍了很多关于ABP框架的后台Web API 服务端,以及基于Vue+Element前端应用,本篇针对两者的联合部署,以及对部署中遇到的问题进行处理.ABP框架的后端是基于.net core5.0 ...
随机推荐
- CentOS 使用 LAMP 环境开启 SSL 搭建 WordPress
环境阿里云新装CentOS 7.4, 使用yum(非编译安装)搭建LAMP, CA证书为阿里云免费提供的, WordPress为官网下载 安装 LAMP 并开启 HTTPS 1, 关闭防火墙 # sy ...
- linux命令随身记
赋予权限命令:chmod 755 * 查询进程: ps -ef |grep abc 查看含有"abc"的活动进程 ps -ef |grep -v abc 查看不含abc的活动进程 ...
- 17 rest-framework框架的基本组件
序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式.我们可以通过声明与Django ...
- Android Studio快速的接受一个项目
1.关键词搜索法,搜索这个词,然后仔细的去找找.肯定可以找到的,虽然可能会有一些奔波. 2.Android device moniter ,可以抓屏幕,看布局,而且可以看到资源id.看到资源id,你说 ...
- wireshark 获取RTP payload
wireshark 抓包获取RTP TS流数据,保存为TS文件 首先解析RTP流 2.点击菜单栏[Statistics]-[RTP]-[Show All Streams] 3.在Wireshark:R ...
- 独立开发unity2d游戏的问答群
129443731 有志独立开发游戏的,只讨论最新的unity2d技术的.群里面主要已问答为主,喜欢聊天的就别加群了,灌水多了会被t.希望能对unity2d比较了解的已及喜欢学习的人加入.
- leetcode 【 Linked List Cycle 】 python 实现
题目: Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ...
- [网站公告]1月10日1:00-7:00阿里云RDS维护会造成30秒闪断
大家好! 阿里云将于1月10号1:00-7:00(今天夜里)对杭州机房部分RDS实例所在的物理主机做维护操作,维护期间部分RDS实例会有1-2次闪断,每次闪断时间在30秒以内. 我们使用的RDS实例将 ...
- 自动化测试学习之路--HTML常见元素、属性的简单学习
如何创建html文件: 使用工具:VSCode 1.双击文件名显示区,可快速新建文件. 2.保存文件,文件名.html 3.输入!(必须是英文的!),按 Tab键,可自动生成html格式的文件,如下: ...
- shell监控脚本
序言: 前几天一好友问我服务器监控怎么做?你们公司的监控是怎么做的?有什么开源的监控软件推荐?常见的开源的监控软件当然首先推荐ZABBIX,分布式够强大,而且很多公司都在用,我问他具体什么需求,能监控 ...