欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c/c++ 网络编程 陈硕老师视频理解之ttcp

程序员文章站 2022-06-25 15:00:17
ttcp 是干啥的:测试2台机器间的网络传输性能 "wiki" 功能如下图: 对应的视频是: 4.回顾基础的Sockets API.mkv 5.TTCP代码概览.mkv 6.使用TTCP进行网络传输性能测试.mkv 代码: "github" 准备事项: ​ 安装boost库, "安装方法" 编译方法 ......

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

  • wiki
  • 功能如下图:

c/c++ 网络编程 陈硕老师视频理解之ttcp

对应的视频是:

  • 4.回顾基础的sockets api.mkv

  • 5.ttcp代码概览.mkv
  • 6.使用ttcp进行网络传输性能测试.mkv

代码:

准备事项:

​ 安装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));