UDT源码剖析(二):UDT自带例程recvfile注释

这几天学习了UDT自带的例子,结合源码进行了测试如下:


#ifndef WIN32

   #include <arpa/inet.h>
   #include <netdb.h>
#else
   #include <winsock2.h>
   #include <ws2tcpip.h>
#endif
#include <fstream>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <udt.h>


using namespace std;


int main(int argc, char* argv[])
{
   if ((argc != 5) || (0 == atoi(argv[2])))
   {
      cout << "usage: recvfile server_ip server_port remote_filename local_filename" << endl;
      return -1;
   }


   // use this function to initialize the UDT library
   // 初始化UDT库
   UDT::startup();


   // 地址信息提示、目标的地址信息指针
   struct addrinfo hints, *peer;


   // 内存初始化,全部置为0,设置同sendfile
   memset(&hints, 0, sizeof(struct addrinfo));
   hints.ai_flags = AI_PASSIVE;
   hints.ai_family = AF_INET;
   hints.ai_socktype = SOCK_STREAM;


   // 创建一个本地Socket
   UDTSOCKET fhandle = UDT::socket(hints.ai_family, hints.ai_socktype, hints.ai_protocol);


   // 根据传入参数和地址信息提示创建目标地址信息
   if (0 != getaddrinfo(argv[1], argv[2], &hints, &peer))
   {
      cout << "incorrect server/peer address. " << argv[1] << ":" << argv[2] << endl;
      return -1;
   }


   // connect to the server, implict bind
   // 连接到服务器,第一个参数为Socket,第二个为连接地址,第三个为地址长度(底层用来判断是否符合IPv4、IPv6标准的长度)
   if (UDT::ERROR == UDT::connect(fhandle, peer->ai_addr, peer->ai_addrlen))
   {
      cout << "connect: " << UDT::getlasterror().getErrorMessage() << endl;
      return -1;
   }


   // 释放通过getaddrinfo分配的地址信息
   freeaddrinfo(peer);


   // send name information of the requested file
   // 发送请求的文件名称
   int len = strlen(argv[3]);


   // 向目标发送文件名的长度
   // 第一个参数为Socket,第二个参数为数据地址,第三个参数为数据长度,第四个参数会被底层忽略,没有意义
   if (UDT::ERROR == UDT::send(fhandle, (char*)&len, sizeof(int), 0))
   {
      cout << "send: " << UDT::getlasterror().getErrorMessage() << endl;
      return -1;
   }


   // 向目标发送文件名
   // 第一个参数为Socket,第二个参数为数据地址,第三个参数为数据长度,第四个参数会被底层忽略,没有意义
   if (UDT::ERROR == UDT::send(fhandle, argv[3], len, 0))
   {
      cout << "send: " << UDT::getlasterror().getErrorMessage() << endl;
      return -1;
   }


   // get size information
   // 接收文件大小
   int64_t size;


   // 接收一个文件大小数据,内容为一个int64_t值,长度为int64_t的长度,数值保存在size中
   // 第一个参数为Socket,第二个参数为数据保存地址,第三个参数为数据长度,第四个参数底层会忽略,没有意义
   if (UDT::ERROR == UDT::recv(fhandle, (char*)&size, sizeof(int64_t), 0))
   {
      cout << "send: " << UDT::getlasterror().getErrorMessage() << endl;
      return -1;
   }


   // 负值表示没有该文件
   if (size < 0)
   {
      cout << "no such file " << argv[3] << " on the server\n";
      return -1;
   }


   // receive the file
   // 开始接收文件
   // 通过二进制方式写入文件,如果文件已存在则覆盖
   fstream ofs(argv[4], ios::out | ios::binary | ios::trunc);


   // 接收到的数据大小以及偏移量
   int64_t recvsize;
   int64_t offset = 0;


   // 从0位置开始接收文件数据
   // 第一个参数为Socket,第二个参数为文件流,第三个参数为偏移量,第四个参数为文件大小
   if (UDT::ERROR == (recvsize = UDT::recvfile(fhandle, ofs, offset, size)))
   {
      cout << "recvfile: " << UDT::getlasterror().getErrorMessage() << endl;
      return -1;
   }


   // 关闭连接Socket
   UDT::close(fhandle);


   // 关闭文件流
   ofs.close();


   // use this function to release the UDT library
   // 释放UDT库
   UDT::cleanup();


   return 0;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建立公司

最近标哥说有创业的想法&#xff0c;然后我帮忙搜了下关于创办公司的一些文章&#xff0c;晓宇的这篇文章把创业的过程写了个大概&#xff0c;也分享给大家&#xff0c;如果有创业想法的&#xff0c;按照这样的思路去寻找自己的合伙人。 自从17年4月份开始辞职创业&#xff0c;…

想在创建虚拟机的时候指定ip调研

想调研一下libvit xml能否提供类似的配置选项&#xff1a; xml应该写成这个样子&#xff0c;预先要在宿主机上面创建br0&#xff0c;配置要分配指定ip Using an existing host bridge Since 0.9.4 This shows how to use a pre-existing host bridge "br0". The gues…

UDT源码剖析(三):UDT::startup()过程代码注释

调用路线 UDT::startup()->CUDT::startup()->CUDTUnited::startup() 1 int startup() 2 { 3 return CUDT::startup(); 4 } 1 int CUDT::startup() 2 { 3 return s_UDTUnited.startup(); 4 } 查看源代码 打印帮助1 int CUDTUnited::startup() 2 { 3 // 开启一个…

第五节 CImage和CBmp(二)

由于这个库主要用于VC MFC下开发应用&#xff0c;因此目前可以下载到版本只支持MFC开发。如果您需要标准Win32的库&#xff0c;可以在回复时留下您的邮箱&#xff0c;或跟我联系。Email&#xff1a;wuchunlei163.comQQ&#xff1a;819543772EasyAnalysis图像分析库测试版以及源…

Linux 新系统易用性向 Windows 看齐

大家好&#xff0c;今天是一年一度的高考&#xff0c;不知道各位在多年以前有没有后悔选择电子专业&#xff0c;如果再给你一次机会&#xff0c;你会选择其他专业吗&#xff1f;以下是内容正文&#xff0c;由黄工整理&#xff01;来源 | 网络嵌入式开发&#xff0c;很多工程师都…

深度剖析SOC高性能实时事件关联分析引擎

【引言】安全管理平台&#xff08;SOC&#xff09; 的一项关键技术就是事件关联分析。借助实时的事件关联分析引擎&#xff0c;安全管理平台能够发掘出复杂的海量安全日志和事件背后隐藏的信息&#xff0c;引导安全管理人员发现外 部***和内部违规行为。作为本系列的第五篇文章…

P3165 [CQOI2014]排序机械臂

传送门 就是说要维护一个数据结构资瓷区间反转和查询第\(K\)大&#xff0c;那么splay吧 我们可以把原数组按高度为第一关键字&#xff0c;下标为第二关键字排序&#xff0c;然后直接建出splay 这样的话每次第\(K\)大直接查询编号然后把它转到根节点&#xff0c;那么左子树大小1…

靠,嘉立创打板又降价

说个题外话&#xff0c;我前段时间和同事聊天&#xff0c;我同事是一个项目经理&#xff0c;我跟他说我有朋友在嘉立创&#xff0c;然后随口说了句&#xff0c;我们这个行业应该没有不知道嘉立创的吧&#xff0c;我同事回了一句&#xff0c;什么是嘉立创&#xff0c;然后我愣了…

动态提示的下拉框

<html> <head> <meta http-equiv"Content-Type" content"text/html; charsetgb2312"> <META content"fason,阿信" nameAuthor> <title>动态提示的下拉框</title> <style> a{color:red;text-decoratio…

深度解析Cocoa异步请求和libxml2.dylib教程(1)

深度解析Cocoa异步请求和libxml2.dylib教程是本文要介绍的内容&#xff0c;不多说&#xff0c;直接进入话题&#xff0c;很早就在cocoachina上看到这个框架了,今天终于有机会来使用这个东东了. 我这里写一下,如何往iphone项目中添加这个框架. 步骤如下: 1.下载该framework : ht…

UDT源码剖析(四):UDT的GC线程相关过程代码注释

着UDT::Startup()的启动&#xff0c;GC线程也随之运行了。 GC主要关注的就是UDTSocket的释放&#xff0c;下面我们来看看这个GC线程是怎么实现的。 查看源代码 打印帮助1 #ifndef WIN32 2 void* CUDTUnited::garbageCollect(void* p) 3 #else 4 DWORD WINAPI CUDTUnited:…

那年高考

每年高考&#xff0c;都会让我想起很多事情。我第一次高考前几天&#xff0c;我舅舅和舅娘过来看我&#xff0c;他们拉我到教室后门&#xff0c;我舅说我妈叮嘱他一定来看我&#xff0c;然后跟我说不要给自己太大压力&#xff0c;啰嗦了几分钟&#xff0c;要走的时候硬塞给我10…

vimdiff的简单使用

Vimdiff的使用 1、首先vimdiff是一款高效的文件的比较和合并的工具&#xff0c;它具有以下一些特点&#xff1a;命令行方式的比较工具&#xff1b;简单明了的界面&#xff1b;对比较出来的多处差异之间快速定位&#xff1b;进行文件合并。再使用vimdiff命令之前&#xff0c;我们…

拆解一个比亚迪的车钥匙,这个黑黑的元器件是什么?

今天抽屉突然找到一个比亚迪的车钥匙&#xff0c;寻思着没事拆开看看用什么方案做的。正面照&#xff0c;哪款车型的&#xff0c;不知道了背面照&#xff0c;很简洁&#xff0c;只有一个BYD的Logo接下来就是撬开了&#xff0c;过程非常顺利&#xff0c;之前撬开一个宝马车的钥匙…

分布式事物(同样适用于dubbo事务等分布式事务)

转载于:https://www.cnblogs.com/tian1993/p/10081901.html

一些web开发中常用的、做成cs文件的js代码 - 搜刮来的

using System;using System.Web;using System.Web.UI;namespace COCOWO.COMP{ /// <summary> /// 一些常用的Js调用 /// 创建时间&#xff1a;2006-8-3 /// 创建者&#xff1a;马先光 /// </summary> public class Jscript { …

库里扛起了勇士对凯尔特人的第四场

最近临近毕业季&#xff0c;有朋友这样说「我一定是要支持勇士的&#xff0c;毕竟库里和詹姆斯陪了整个大学四年啊」。昨晚上加班到11点半&#xff0c;到家洗完澡已经是凌晨1点了&#xff0c;那时候是想得很清楚的&#xff0c;明天是不想被其他事情打扰我看球赛的。这场比赛&am…

Nginx应用案例分享:压力测试

2019独角兽企业重金招聘Python工程师标准>>> 在运维工作中&#xff0c;压力测试是一项非常重要的工作。比如在一个网站上线之前&#xff0c;能承受多大访问量、在大访问量情况下性能怎样&#xff0c;这些数据指标好坏将会直接影响用户体验。 但是&#xff0c;在压力…

shell 判断文件是否存在,没有则创建

没有该文件则创建&#xff0c;有则 ls -l 输出文件信息。 #!/bin/bash echo "enter the name:" read filename if test -e $filename ; then ls -l $filename else touch $filename fi 输出 enter the name: sss.sh -rwxr-xr-x 1 root root 147 Dec 3 09:02 sss.sh …

声音是什么?

转自博客园《【秒懂音视频开发】02_重识声音》&#xff0c;https://www.cnblogs.com/mjios/p/14466418.html#5035688#!comments声音的产生声音&#xff08;Sound&#xff09;&#xff0c;是由物体的振动产生的。一切正在发声的物体都在振动。我们说话的时候&#xff0c;是声带在…