本来是想看看当发送缓冲区或者接收缓冲区快满的时候,继续发包的话,滑动窗口是怎样变化的,就写了一个测试的demo,测试了很多次感觉设置的发送缓冲去大小不生效似的,最后发现不是真的不生效,而是这样的一个结论:
在Linux系统中,不管你设置的发送缓冲去是多少,只要是你设置的小于8192,即使你通过接口拿到的缓冲区是你设置的值*2,这个fd的发送缓冲去仍然就是16384
测试demo如下
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#define BUF_LEN 16385
int main(int argc,char* argv[])
{
// const char* ip = “11.12.85.92”;
const char* ip = “127.0.0.1”;
int port = 8097;
int ret ;
int buf_len = BUF_LEN;
struct sockaddr_in remote_addr;
bzero(&remote_addr,sizeof(remote_addr));
remote_addr.sin_family = AF_INET;
remote_addr.sin_addr.s_addr = inet_addr(ip);
remote_addr.sin_port = htons(port);
int remote_sockfd = socket(AF_INET,SOCK_STREAM,0);
int flag ;
//连接
ret = connect(remote_sockfd,(struct sockaddr*)&remote_addr,sizeof(struct sockaddr));
if(ret < 0)
{
printf("connect failed\n");
if(ret == EINPROGRESS)
{
struct timeval time = {5, 0};
select(0, NULL, NULL, NULL, &time);//暂停5s秒
}
}
printf("connect success\n");
flag = fcntl(remote_sockfd, F_GETFL,0);
fcntl(remote_sockfd, F_SETFL, flag|O_NONBLOCK);//设置为非阻塞
int nSendBuf=1024;//设置发送缓冲区的大小为 1024*2
ret = setsockopt(remote_sockfd,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));
if(ret != 0)
{
printf("set socket recv failed \n");
}
//取得设置的发送缓冲区
int snd_size=0;
int optlen = sizeof(snd_size);
int err = getsockopt(remote_sockfd, SOL_SOCKET, SO_SNDBUF,&snd_size, &optlen);
if(err<0){
printf("获取发送缓冲区大小错误\n");
} else
{
printf("send buf = %d\n", snd_size);
}
sleep(10);
int len = 0;
char buf[BUF_LEN];
fd_set fdsr;
FD_ZERO(&fdsr);
FD_SET(remote_sockfd, &fdsr);
memset(buf, 56, 18);
int i;
struct timeval wait_time = {3,0};
i = 50;
while(i-->0)
{
int status = 0;
ret = send(remote_sockfd, buf, buf_len , 0);
if(ret < 0)
{
perror("send");
printf("send failed ret = %d!!! errno = %d +++\n",ret, errno);
}else
{
perror("send");
printf("send ret = %d!!! errno = %d +++\n",ret, errno);
}
}
}