博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用实际案例来理解netstat -nao中的Recv-Q和Send-Q
阅读量:4142 次
发布时间:2019-05-25

本文共 3600 字,大约阅读时间需要 12 分钟。

       我们先来看看:

 

xxxxxx$ netstat -ano | head             Active Internet connections (servers and established)Proto Recv-Q Send-Q Local Address           Foreign Address         State       Timertcp        0      0 127.0.0.1:42222         0.0.0.0:*               LISTEN      off (0.00/0/0)tcp        0      0 10.100.70.140:48369     0.0.0.0:*               LISTEN      off (0.00/0/0)tcp        0      0 10.100.70.140:13942     0.0.0.0:*               LISTEN      off (0.00/0/0)tcp        0      0 10.100.70.140:10586     0.0.0.0:*               LISTEN      off (0.00/0/0)tcp        0      0 10.100.70.140:63227     0.0.0.0:*               LISTEN      off (0.00/0/0)tcp        0      0 0.0.0.0:8765            0.0.0.0:*               LISTEN      off (0.00/0/0)tcp        0      0 10.100.70.140:20126     0.0.0.0:*               LISTEN      off (0.00/0/0)tcp        0      0 10.100.70.140:23456     0.0.0.0:*               LISTEN      off (0.00/0/0)

       第二列表内核recv缓冲区中的字节数(接收缓冲区), 第三列表示内核send缓冲区中的字节数(发送缓冲区)。 所以, 对于一个tcp连接的两端而言, 有四个内核缓冲区。

 

 

       来看程序, 服务端:

 

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(){ int sockSrv = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_addr.s_addr = INADDR_ANY; addrSrv.sin_port = htons(8765); bind(sockSrv, (const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in)); listen(sockSrv, 5); struct sockaddr_in addrClient; int len = sizeof(struct sockaddr_in); int sockConn = accept(sockSrv, (struct sockaddr *)&addrClient, (socklen_t*)&len); while(1) { getchar(); char szRecvBuf[1001] = {0}; int iRet = recv(sockConn, szRecvBuf, sizeof(szRecvBuf) - 1, 0); printf("iRet is %d\n", iRet); } getchar(); close(sockConn); close(sockSrv); return 0;}

       客户端:

 

 

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(){ int sockClient = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addrSrv; addrSrv.sin_addr.s_addr = inet_addr("10.100.70.140"); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(8765); connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in)); #define N 2000 char szSendBuf[N] = {0}; for(unsigned int i = 0; i < N; i++) //×Ö·ûÊý×é×îºóÒ»¸ö×Ö·û²»ÒªÇóÊÇ¡®\0¡¯ { szSendBuf[i] = 'a'; } int total = 0; while(1) { int iRet = send(sockClient, szSendBuf, sizeof(szSendBuf) , 0); total += iRet; printf("iRet is %d, total send is %d\n", iRet, total); getchar(); } close(sockClient); return 0;}

       我们先开启服务端, 再看起客户端, 此时客户端给服务端发送了2000字节, 但服务端没有去取出这2000字节, 我们来看看服务端的情况:

 

 

xxxxxx$ netstat -ano | grep 8765tcp        0      0 0.0.0.0:8765            0.0.0.0:*               LISTEN      off (0.00/0/0)tcp     2000      0 10.100.70.140:8765      10.100.70.139:43634     ESTABLISHED off (0.00/0/0)

       再看看客户端, 客户端都发送完了, 没有字节积压, 所以发送缓冲区中么有字节, 如下:

 

xxxxxx$ netstat -ano | grep 8765tcp        0      0 10.100.70.139:43634     10.100.70.140:8765      ESTABLISHED off (0.00/0/0)

       

        此时, 如果我们在服务端用recv函数取出1000字节, 会怎样呢?  显然, 内核缓冲区中还剩100字节, 如下:

 

xxxxxx$ netstat -ano | grep 8765tcp        0      0 0.0.0.0:8765            0.0.0.0:*               LISTEN      off (0.00/0/0)tcp     1000      0 10.100.70.140:8765      10.100.70.139:43634     ESTABLISHED off (0.00/0/0)

 

        如何才能在客户端上看到内核缓冲区中的数据呢? 很简单, 让客户端一只发发发, 服务端的内核缓冲区数据塞满后, 自然开始在客户端的内核缓冲区积压了。 有兴趣的朋友可以试试, 这对理解tcp很有帮助。

 

 

       

 

 

转载地址:http://ynwti.baihongyu.com/

你可能感兴趣的文章
菜单树
查看>>
Servlet的生命周期
查看>>
JAVA八大经典书籍,你看过几本?
查看>>
《读书笔记》—–书单推荐
查看>>
JAVA数据类型
查看>>
【Python】学习笔记——-6.2、使用第三方模块
查看>>
【Python】学习笔记——-7.0、面向对象编程
查看>>
【Python】学习笔记——-7.2、访问限制
查看>>
【Python】学习笔记——-7.3、继承和多态
查看>>
【Python】学习笔记——-7.5、实例属性和类属性
查看>>
git中文安装教程
查看>>
虚拟机 CentOS7/RedHat7/OracleLinux7 配置静态IP地址 Ping 物理机和互联网
查看>>
Jackson Tree Model Example
查看>>
常用js收集
查看>>
如何防止sql注入
查看>>
springmvc传值
查看>>
在Eclipse中查看Android源码
查看>>
Android使用webservice客户端实例
查看>>
[转]C语言printf
查看>>
C 语言 学习---获取文本框内容及字符串拼接
查看>>