linux内核中socket读取和接收的缓冲区大小

2023-11-10

linux内核中socket读取和接收的缓冲区大小

1、socket内核缓冲区大小可用getsockopt获取
2、socket内核缓冲区大小可用setsockopt设置,缓冲区的大小为设置的值的2倍,具体设置代码入下
3、socket缓冲区设置最大为多大呢?
接收缓冲区最大为:/proc/sys/net/core/rmem_max
接收缓冲区大小默认为:/proc/sys/net/core/rmem_default

问题(望大神回答):
1、发送缓冲区大小最大值跟默认值是多少呢?
2、为什么新创建的socket的接收缓存区的大小,跟/proc/sys/net/core/rmem_default中设置的值不一样呢?
3、内核中的socket缓冲区的大小,对于应用层编程有什么影响呢?
4、接收跟发送的缓冲区的大小多少合适呢?


#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(void)
{
        int socketFd;

        if ((socketFd = socket(PF_INET, SOCK_STREAM,0)) < 0)
        {
        /* 获取socket发送和接收缓冲区的大小 */
        optlen = sizeof(snd_size);
        err = getsockopt(socketFd, SOL_SOCKET, SO_SNDBUF, &snd_size, &optlen);
        if (err < 0)
        {

                printf("get send buff failed!\n");
        }

        optlen = sizeof(rcv_size);
        err = getsockopt(socketFd, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen);
        if (err < 0)
        { 
                printf("get rev buff failed!\n");
        }   
            
        printf("senBuffLen:%d\n", snd_size);
        printf("recBuffLen:%d\n", rcv_size);

        /* 设置socket发送和接收缓冲区大小都为8K */
        snd_size = 8*1024;
        optlen = sizeof(rcv_size);
        err = setsockopt(socketFd, SOL_SOCKET, SO_SNDBUF, &snd_size, optlen);
        if(err<0)
        {
                printf("set send buff failed!\n");
        }

        rcv_size = 8*1024;
        optlen = sizeof(rcv_size);
        err = setsockopt(socketFd,SOL_SOCKET,SO_RCVBUF, (char *)&rcv_size, optlen);
        if(err<0){
                printf("set rev buff failed!\n");
        }

        /* 获取socket接收和发送缓冲区大小 */
        optlen = sizeof(snd_size);
        err = getsockopt(socketFd, SOL_SOCKET, SO_SNDBUF, &snd_size, &optlen);
        if (err < 0)
        {
                printf("get send buff failed!\n");
        }

        optlen = sizeof(rcv_size);
        err = getsockopt(socketFd, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen);
        if (err < 0)
        {
                printf("get rev buff failed!\n");
        }

        printf("senBuffLen:%d\n", snd_size);
        printf("recBuffLen:%d\n", rcv_size);


        return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux内核中socket读取和接收的缓冲区大小 的相关文章