TCP连接的发送缓冲区和接收缓冲区


一、基础知识

系统会为每个TCP socket创建一个发送缓冲区和一个接收缓冲区。应用程序调用write向套接字写数据时,内核从应用进程缓冲区中拷贝数据到套接字的发送缓冲区中。

二、查看TCP连接缓冲区大小

发送缓冲区的缺省大小为2.5M,接收缓冲区的缺省大小为1M。

以下是查看TCP连接缓冲区大小的完整客户端代码,程序名为bufSize.cpp

  • step1:客户端创建socket
  • step2:客户端与指定的ip地址和端口号建立TCP连接
  • step3:查看TCP连接缓冲区大小
#include <sys/socket.h>
#include <sys/types/h>

int main(int argv, char* argv[]){
	//判断参数传递是否正确,正确格式为./bufSize ip port
	if(argc != 3){
		printf("Usage: ./bufSize ip port\n");
		return -1;
	}
	
	//step1
	int sockfd;
	struct sockaddr_in servaddr;
	char buf[1024];
	//建立套接字
	if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
	// 建立套接字不成功,显示失败信息,程序返回
	printf("socket failed.\n");return -1;}
	
	//step2
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(atoi(argv[2]));
	servaddr.sin_addr.s_addr = inet_addr(argv[1]);
	//与服务器建立连接
	if(connect(sockfd, (sockaddr*)&servaddr, sizeof(servaddr) != 0){
		printf("connect failed.\n"); 
		close (sockfd);
		return -1;
	}
	printf("connect ok.\n");

	// step3:查看缓冲区大小代码
	int bufsize = 0;  //记录缓冲区大小的变量
	socklen_t optlen = sizeof(bufsize);
	//获取并打印接收缓冲区的大小
	getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &bufsize, &optlen);
	printf("recv bufsize = %d\n", bufsize);	
	
	}
		
		
	int bufsize = 0;  //记录缓冲区大小的变量
	socklen_t optlen = sizeof(bufsize);
	//获取接收缓冲区的大小
	getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &bufsize, &optlen);
	printf("recv bufsize = %d\n", bufsize);
	//获取发送缓冲区的大小
	getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &bufsize, &optlen);
	printf("send bufsize = %d\n", bufsize);

获取缓冲区大小的核心函数为getsockopt,该函数的使用方法如下:

int getsockopt(int sockfd, int level, int option_name, void* option_value, socklen_t* option_len);

参数:

  • sockfd 套接字描述符
  • level 协议级别:在套接字API级别操作时为SOL_SOCKET
  • option_name 选项名称:取值取决于level协议级别
    如果是在套接字级别有SO_SNDBUF(获取发送缓冲区长度)、SO_RCVBUF(获取接收缓冲区长度)以及其他参数

参考文章
https://www.cnblogs.com/huanxiyun/articles/5381629.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值