当前位置: 移动技术网 > IT编程>开发语言>C/C++ > c/c++ 网络编程 陈硕老师视频理解之ttcp

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

2019年04月12日  | 移动技术网IT编程  | 我要评论

隆尧贴吧,成都理工大学教务处,upcun

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

  • wiki
  • 功能如下图:

对应的视频是:

  • 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));

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网