如何更改socket的发送缓冲去,以及更改socket的发送缓冲区出现的问题

本来是想看看当发送缓冲区或者接收缓冲区快满的时候,继续发包的话,滑动窗口是怎样变化的,就写了一个测试的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);
    }

}

}

发布了16 篇原创文章 · 获赞 6 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41163331/article/details/93773524