文章目录
一、基础知识
系统会为每个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