ttcp 是干啥的:测试2台机器间的网络传输性能

  • wiki
  • 功能如下图:

对应的视频是:

  • 4.回顾基础的Sockets API.mkv

  • 5.TTCP代码概览.mkv

  • 6.使用TTCP进行网络传输性能测试.mkv

代码:

github

准备事项:

​ 安装boost库,安装方法

编译方法:

cd recipes-master/tpc
./build.sh

执行时的参数说明:

Allowed options:
-h [ --help ] Help
-p [ --port ] arg (=5001) TCP port
-l [ --length ] arg (=65536) Buffer length
-n [ --number ] arg (=8192) Number of buffers
-t [ --trans ] arg Transmit
-r [ --recv ] Receive
-D [ --nodelay ] set TCP_NODELAY

接收端的运行方法:

./ttcp -r

发送端的运行方法:

while true; do ./ttcp -t 发送端机器的IP地址或者名字; done

学到的知识点:

1,recv的第四参数MSG_WAITALL的作用

int TcpStream::receiveAll(void* buf, int len)
{
// FIXME: EINTR
return ::recv(sock_.fd(), buf, len, MSG_WAITALL);
}

一端发送(send)了长度为100的数据,接收端如果没有使用recv的MSG_WAITALL,那么调用一次recv后,就把数据都接收完了,再次在同样的fd上接收数据会发送什么???

如果接收端使用了recv的MSG_WAITALL,那么就可以多次调用recv,直到接受完所有的数据。

比如第一次想接收前面20个字节的数据:

​ ::recv(sock_.fd(), buf, 20, MSG_WAITALL);

然后第二次把剩余的100-20=80个字节的数据接受完:

​ ::recv(sock_.fd(), buf, 80, MSG_WAITALL);

ttcp.cc文件的140行,一次send了4 +65536个字节的数据,

然后ttcp.cc文件的185行,先接收了4个字节;

然后ttcp.cc文件的192行,又接收了后面的65536个字节;

MSG_WAITALL (since Linux 2.2)
This flag requests that the operation block until the full
request is satisfied. However, the call may still return less
data than requested if a signal is caught, an error or discon‐
nect occurs, or the next data to be received is of a different
type than that returned. This flag has no effect for datagram
sockets.

2,如果结构体的最后一个元素是个长度为0的数组,这个结构体所占用的内存空间是由运行时期决定。

struct PayloadMessage
{
int32_t length;
char data[0];
};
//变量total_len是,别的机器发过来的长度,所以payload指向的内存空间的大小是运行时期才能够决定的。
PayloadMessage* payload = static_cast<PayloadMessage*>(::malloc(total_len));

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

c/c++ 网络编程 陈硕老师视频理解之ttcp的更多相关文章

  1. 脑残式网络编程入门(四):快速理解HTTP/2的服务器推送(Server Push)

    本文原作者阮一峰,作者博客:ruanyifeng.com. 1.前言 新一代HTTP/2 协议的主要目的是为了提高网页性能(有关HTTP/2的介绍,请见<从HTTP/0.9到HTTP/2:一文读 ...

  2. Qt网络编程QTcpServer和QTcpSocket的理解

    前一段时间通过调试Qt源码,大致了解了Qt的事件机制.信号槽机制.毕竟能力和时间有限.有些地方理解的并不是很清楚. 开发环境:Linux((fedora 17),Qt版本(qt-everywhere- ...

  3. Python中网络编程对 listen 函数的理解

    listen函数的第一个参数时SOCKET类型的,该函数的作用是在这个SOCKET句柄上建立监听,至于有没有客户端连接进来,就需要accept函数去进行检查了,accept函数的第一个参数也是SOCK ...

  4. 网络编程懒人入门(十):一泡尿的时间,快速读懂QUIC协议

    1.TCP协议到底怎么了? 现时的互联网应用中,Web平台(准确地说是基于HTTP及其延伸协议的客户端/服务器应用)的数据传输都基于 TCP 协议. 但TCP 协议在创建连接之前需要进行三次握手(如下 ...

  5. 不为人知的网络编程(九):理论联系实际,全方位深入理解DNS

    本文原作者:selfboot,博客地址:selfboot.cn,Github地址:github.com/selfboot,感谢原作者的技术分享. 1.引言 对于 DNS(Domain Name Sys ...

  6. 不为人知的网络编程(八):从数据传输层深度解密HTTP

    1.引言 在文章<理论联系实际:Wireshark抓包分析TCP 3次握手.4次挥手过程>中,我们学会了用wireshark来分析TCP的“三次握手,四次挥手”,非常好用.这就是传说中的锤 ...

  7. 脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?

    本文引用了公众号纯洁的微笑作者奎哥的技术文章,感谢原作者的分享. 1.前言   老于网络编程熟手来说,在测试和部署网络通信应用(比如IM聊天.实时音视频等)时,如果发现网络连接超时,第一时间想到的就是 ...

  8. 五分钟学Java:如何学习Java面试必考的网络编程

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 简介 Java作为一门后端语言,对于网络编程的支持是必不可少的,但是,作为一个经常CRUD的Java工程师,很多时候都不 ...

  9. 【深入浅出Linux网络编程】 “实践 -- TCP & UDP”

    通过上一篇博客的学习,你应该对基于epoll的事件触发机制有所掌握,并且通过阅读sio.c/sio.h应该也学会了如何封装epoll以及如何通过设计令epoll更加实用(用户回调,用户参数). 简单回 ...

随机推荐

  1. mysql的内建日期处理函数

    下面的表格列出了MySQL 中最重要的内建日期函数: 函数 描述 NOW() 返回当前的日期和时间 CURDATE() 返回当前的日期 CURTIME() 返回当前的时间 DATE() 提取日期或日期 ...

  2. 。net加密解密相关方法

    AES加密及解密 声明密钥级偏移向量--------/// <summary> /// 加密密钥 /// </summary> private static readonly ...

  3. jenkins+gitlab自动化编译部署方案探索及服务端编译webpack实战

    一. 背景 之前我们的开发流程为在本地进行webpack打包编译,然后svn提交源代码和编译后的代码.同时每次提交前也会从svn更新源代码和编译后的代码.这样做有几个缺点: 1. svn 更新和提交编 ...

  4. Kali Linux安装VMWare Tools

    操作环境: 虚拟机操作系统: Kali Linux 2017.2 虚拟化软件: VMWare workstation 14 pro 加载光盘 在VMWare上依次点击"虚拟机->安装V ...

  5. name属性作用+使用$.post()取代name属性在提交表单信息中的作用

    name的用途 1)主要是用于获取提交表单的某表单域信息, 作为可与服务器交互数据的HTML元素的服务器端的标示,比如input.select.textarea.框架元素(iframe.frame.  ...

  6. 一个靠谱的phpredisadmin文件

    http://download.csdn.net/detail/newjueqi/7227487

  7. Spring_boot简单操作数据库

    Spring_boot搭配Spring Data JPA简单操作数据库 spring boot 配置文件可以使用yml文件,默认spring boot 会加载resources目录的下的applica ...

  8. Python爬虫利器五之Selenium的用法

    1.简介 Selenium 是什么?一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的 ...

  9. [爬虫]Scrapy 错误ordinal not in range(128)

    报错了: UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 1: ordinal not in range(12 ...

  10. RabbitMQ 集群与网络分区(理论知识)

    关于network partition网络设备故障导致的网络分裂.比如,存在A\B\C\D\E五个节点,A\B处于同一子网,B\C\D处于另外一子网,中间通过交换机相连.若两个子网间的交换机故障了即发 ...