隆尧贴吧,成都理工大学教务处,upcun
4.回顾基础的sockets api.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));
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
如何在没有core文件的情况下用dmesg+addr2line定位段错误
用QT制作3D点云显示器——QtDataVisualization
网友评论