精华内容
下载资源
问答
  • BufferedWritter设置缓冲区大小

    千次阅读 2017-09-07 17:54:26
    用BufferedWritter来写入文件,可以设置缓冲区大小

    用BufferedWritter来写入文件,可以设置缓冲区的大小。

    File file = new File("D:\\");
    File tempFile = File.createTempFile("abc", ".csv", file);
    FileOutputStream fos = new FileOutputStream(tempFile);
    OutputStreamWriter osWritter = new OutputStreamWriter(fos, "GBK");//设置字符编码
    BufferedWriter bufferedWriter = new BufferedWriter(osWritter, 1024);//设置缓冲区大小
    bufferedWriter.write("asdfasdf");//写文件

    展开全文
  • 设置Socket缓冲区大小

    万次阅读 2014-01-03 20:34:46
    在进行socket通信的时候我们通过调用recv()函数或者send() 去接收或者发送...在32位的操作系统下,如果我没有记错的话:socket缓冲区默认大小是8192B,但是有些时候我们在传输大文件的时候或者几十G的文件的时候我们想

    在进行socket通信的时候我们通过调用recv()函数或者send() 去接收或者发送一个数据块例如:

    char sndBuf[1024];

    int sndLen = send(sock, sndBuf, sizeof(sndBuf), 0);

    在32位的操作系统下,如果我没有记错的话:socket缓冲区默认大小是8192B,但是有些时候我们在传输大文件的时候或者几十G的文件的时候我们想

    每次发送的数据块更大一些,这样来提高效率,所以我们要对socket底层缓冲区进行扩增,通过下面来实现:

    void SetSocketSize(SOCKET sock, int nsize)
    {
    int nErrCode = 0;//返回值
    unsigned int uiRcvBuf = 0;
    unsigned int uiNewRcvBuf = 0;
    int uiRcvBufLen = sizeof(uiRcvBuf);
    nErrCode= getsockopt(sock, SOL_SOCKET, SO_SNDBUF,(char*)&uiRcvBuf, &uiRcvBufLen);
    if ( SOCKET_ERROR == nErrCode )
    {
    MessageBox("获取服务端设置SOCKET发送缓冲区大小失败");
    return;
    }
    uiRcvBuf *= nsize;//设置系统发送数据为默认的倍数
    nErrCode = setsockopt(sock, SOL_SOCKET, SO_SNDBUF,(char*)&uiRcvBuf, uiRcvBufLen);
    if ( SOCKET_ERROR == nErrCode )
    {
    MessageBox("设置SOCKET发送缓冲区大小失败");
    return;
    }

    }

    这里我也是摘抄一个网友的博客,进行了修改。

    好了,今天有关于socket的缓冲区的设置就介绍到这里,如果有什么不明白的地方或者我哪里说错了,请及时联系我,新浪邮箱:chao_song2011@sina.cn

    展开全文
  • Socket缓冲区大小修改与系统设置

    千次阅读 2020-04-15 21:11:25
    每个Socket在Linux中都映射为一个文件,并与内核中两个缓冲区(读缓冲区写缓冲区)相关联。 或者说,每个Socket拥有两个内核缓冲区。 有时,我们需要修改缓冲区的内核限制的最大值,使其符合我们的实际需求。 ...

     

    每个Socket在Linux中都映射为一个文件,并与内核中两个缓冲区(读缓冲区、写缓冲区)相关联。

    或者说,每个Socket拥有两个内核缓冲区。

    有时,我们需要修改缓冲区的内核限制的最大值,使其符合我们的实际需求。

    一、系统设置

    复制代码

    [jiang@localhost ~]$ uname -a
    Linux localhost.localdomain 2.6.32-642.el6.x86_64 #1 SMP Tue May 10 17:27:01 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
    [jiang@localhost ~]$ cat /proc/sys/net/core/rmem_max
    124928
    [jiang@localhost ~]$ cat /proc/sys/net/core/wmem_max
    124928
    [jiang@localhost ~]$ cat /proc/sys/net/core/rmem_default
    124928
    [jiang@localhost ~]$ cat /proc/sys/net/core/wmem_default
    124928
    

    复制代码

     

    rmem_max:一个Socket的读缓冲区可由程序设置的最大值,单位字节;
    wmem_max:一个Socket的写缓冲区可由程序设置的最大值,单位字节;
    rmem_default:一个Socket的被创建出来时,默认的读缓冲区大小,单位字节;
    wmem_default:一个Socket的被创建出来时,默认的写缓冲区大小,单位字节;

    注:/proc是一个很特殊的文件系统,其并非真实存在于物理磁盘,而是当前系统运行状态的一个映射,存在于RAM中。

    二、应用程序级修改缓冲区大小

    我们可以在程序中动态地修改(通过setsockopt系统调用)持有的有效Socket的读写缓冲区大小。

    复制代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    
    int main(int argc, char **argv)
    {
         if (argc != 2)
         {
             printf("Usage: %s $RCFBUFSIZE\n", argv[0]);
             goto error;
         }
    
        int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
         if (sockfd < 0)
         {
             printf("create socket error=%d(%s)!!!\n", errno, strerror(errno));
             goto error;
         }
    
        // 查看系统默认的socket接收缓冲区大小
         int defRcvBufSize = -1;
         socklen_t optlen = sizeof(defRcvBufSize);
         if (getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &defRcvBufSize, &optlen) < 0)
         {
             printf("getsockopt error=%d(%s)!!!\n", errno, strerror(errno));
             goto error;
         }
         printf("OS default udp socket recv buff size is: %d\n", defRcvBufSize);
    
        // 按照执行参数设置UDP SOCKET接收缓冲区大小
         int rcvBufSize = atoi(argv[1]);
         if (rcvBufSize <= 0)
         {
             printf("rcvBufSize(%d) <= 0, error!!!\n", rcvBufSize);
             goto error;
         }
         printf("you want to set udp socket recv buff size to %d\n", rcvBufSize);
         optlen = sizeof(rcvBufSize);
         if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvBufSize, optlen) < 0)
         {
             printf("setsockopt error=%d(%s)!!!\n", errno, strerror(errno));
             goto error;
         }
         printf("set udp socket(%d) recv buff size to %d OK!!!\n", sockfd, rcvBufSize);
    
        // 查看当前UDP SOCKET接收缓冲区大小
         int curRcvBufSize = -1;
         optlen = sizeof(curRcvBufSize);
         if (getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &curRcvBufSize, &optlen) < 0)
         {
             printf("getsockopt error=%d(%s)!!!\n", errno, strerror(errno));
             goto error;
         }
         printf("OS current udp socket(%d) recv buff size is: %d\n", curRcvBufSize);
    
        close(sockfd);
    
        exit(0);
    
    error:
         if (sockfd >= 0)
             close(sockfd);
         exit(1);
    }

    复制代码

    编译 && 运行:

    [jiang@localhost ~]$ gcc -o main main.c
    [jiang@localhost ~]$ ./main 1024
    OS default udp socket recv buff size is: 124928
    you want to set udp socket recv buff size to 1024
    set udp socket(3) recv buff size to 1024 OK!!!
    OS current udp socket(2280) recv buff size is: 2280

    我们通过setsockopt系统调用成功地修改了sock的接收缓冲区大小。

    但是,代码级的修改缓冲区大小,不是万能的,其受限于系统配置。

    [jiang@localhost ~]$ ./main 1048576
    OS default udp socket recv buff size is: 124928
    you want to set udp socket recv buff size to 1048576
    set udp socket(3) recv buff size to 1048576 OK!!!
    OS current udp socket(249856) recv buff size is: 249856

    可见,我们希望设置接收缓冲区大小为1024*1024B(1MB),但实际并未达到我们的效果,虽然setsockopt成功了!

    我们可以通过修改系统运行时的配置(/proc),来动态地“释放权限”,让应用程序可以设置更大的内核读写缓冲区。

    三、系统配置级修改缓冲区大小

    复制代码

    [jiang@localhost ~]$ su - root
    Password: 
    [root@localhost ~]# echo 262144 > /proc/sys/net/core/rmem_default
    [root@localhost ~]# echo 1048576 > /proc/sys/net/core/rmem_max
    [root@localhost ~]# logout
    [jiang@localhost ~]$ cat /proc/sys/net/core/rmem_default
    262144
    [jiang@localhost ~]$ cat /proc/sys/net/core/rmem_max
    1048576
    [jiang@localhost ~]$ ./main 1048576
    OS default udp socket recv buff size is: 262144
    you want to set udp socket recv buff size to 1048576
    set udp socket(3) recv buff size to 1048576 OK!!!
    OS current udp socket(2097152) recv buff size is: 2097152

     

    我们在root下,修改了系统运行时的配置:

    /proc/sys/net/core/rmem_default
    /proc/sys/net/core/rmem_max

    我们设置读缓冲区默认值为256KB,最大值为1MB。

    程序运行时,我们希望设置读缓冲区为1MB。

    通过输出信息,我们可以验证,修改/proc中的配置文件,我们使得一个socket默认的读缓冲区为256KB,读缓冲区最大值为1MB。

    setsockopt系统调用级设置受限于系统运行时配置,可以通过修改系统配置,使得程序设置更大的读写缓冲区。
    需要注意的两点:

    1.)当系统关机重启时,对/proc的修改,是否依然存在?

    不会。这就比较重要,若服务器由于异常宕机,重启后失去了原有的设置,就有可能导致接收缓冲区过小,出现UDP丢包的可能。

    2.)为什么我通过setsockopt设置读缓冲区值为rcvBufSize,但实际getsockopt获取的读缓冲区大小是2*rcvBufSize?

    这个是和源码有关系。

    (引用自:https://blog.csdn.net/liuguanghui1988/article/details/53375269)

     

    case SO_SNDBUF:
    
    if (val > sysctl_wmem_max)
    
    val = sysctl_wmem_max;
    
    if ((val * 2 ) < SOCK_MIN_SNDBUF)
    
    sk->sk_sndbuf = SOCK_MIN_SNDBUF;
    
    else
    
    sk->sk_sndbuf = val * 2 ;

     

    系统这么做,猜测可能是由于UDP解包封包需要的额外的空间。

    所以,我称r/wmem_max为:可由程序设置的缓冲区最大值。

     

    展开全文
  • UDP:Socket缓冲区大小修改与系统设置 每个Socket在Linux中都映射为一个文件,并与内核中两个缓冲区(读缓冲区、缓冲区)相关联。 或者说,每个Socket拥有两个内核缓冲区。 有时,我们需要修改缓冲区的内核限制...

    UDP:Socket缓冲区大小修改与系统设置

    每个Socket在Linux中都映射为一个文件,并与内核中两个缓冲区(读缓冲区、写缓冲区)相关联。

    或者说,每个Socket拥有两个内核缓冲区。

    有时,我们需要修改缓冲区的内核限制的最大值,使其符合我们的实际需求。

    一、系统设置

    [jiang@localhost ~]$ uname -a
    Linux localhost.localdomain 2.6.32-642.el6.x86_64 #1 SMP Tue May 10 17:27:01 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
    [jiang@localhost ~]$ cat /proc/sys/net/core/rmem_max
    124928
    [jiang@localhost ~]$ cat /proc/sys/net/core/wmem_max
    124928
    [jiang@localhost ~]$ cat /proc/sys/net/core/rmem_default
    124928
    [jiang@localhost ~]$ cat /proc/sys/net/core/wmem_default
    124928

    rmem_max:一个Socket的缓冲区可由程序设置的最大值,单位字节;
    wmem_max:一个Socket的缓冲区可由程序设置的最大值,单位字节;
    rmem_default:一个Socket的被创建出来时,默认的读缓冲区大小,单位字节;
    wmem_default:一个Socket的被创建出来时,默认的写缓冲区大小,单位字节;

    注:/proc是一个很特殊的文件系统,其并非真实存在于物理磁盘,而是当前系统运行状态的一个映射,存在于RAM中。

    二、应用程序级修改缓冲区大小

    我们可以在程序中动态地修改(通过setsockopt系统调用)持有的有效Socket的读写缓冲区大小。

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    
    int main(int argc, char **argv)
    {
        if (argc != 2)
        {
            printf("Usage: %s $RCFBUFSIZE\n", argv[0]);
            goto error;
        }
    
        int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        if (sockfd < 0)
        {
            printf("create socket error=%d(%s)!!!\n", errno, strerror(errno));
            goto error;
        }
    
        // 查看系统默认的socket接收缓冲区大小
        int defRcvBufSize = -1;
        socklen_t optlen = sizeof(defRcvBufSize);
        if (getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &defRcvBufSize, &optlen) < 0)
        {
            printf("getsockopt error=%d(%s)!!!\n", errno, strerror(errno));
            goto error;
        }
        printf("OS default udp socket recv buff size is: %d\n", defRcvBufSize);
    
        // 按照执行参数设置UDP SOCKET接收缓冲区大小
        int rcvBufSize = atoi(argv[1]);
        if (rcvBufSize <= 0)
        {
            printf("rcvBufSize(%d) <= 0, error!!!\n", rcvBufSize);
            goto error;
        }
        printf("you want to set udp socket recv buff size to %d\n", rcvBufSize);
        optlen = sizeof(rcvBufSize);
        if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvBufSize, optlen) < 0)
        {
            printf("setsockopt error=%d(%s)!!!\n", errno, strerror(errno));
            goto error;
        }
        printf("set udp socket(%d) recv buff size to %d OK!!!\n", sockfd, rcvBufSize);
    
        // 查看当前UDP SOCKET接收缓冲区大小
        int curRcvBufSize = -1;
        optlen = sizeof(curRcvBufSize);
        if (getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &curRcvBufSize, &optlen) < 0)
        {
            printf("getsockopt error=%d(%s)!!!\n", errno, strerror(errno));
            goto error;
        }
        printf("OS current udp socket(%d) recv buff size is: %d\n", curRcvBufSize);
    
        close(sockfd);
    
        exit(0);
    
    error:
        if (sockfd >= 0)
            close(sockfd);
        exit(1);
    }
    

    编译 && 运行:

    [jiang@localhost ~]$ gcc -o main main.c
    [jiang@localhost ~]$ ./main 1024
    OS default udp socket recv buff size is: 124928
    you want to set udp socket recv buff size to 1024
    set udp socket(3) recv buff size to 1024 OK!!!
    OS current udp socket(2280) recv buff size is: 2280

    我们通过setsockopt系统调用成功地修改了sock的接收缓冲区大小。

    但是,代码级的修改缓冲区大小,不是万能的,其受限于系统配置。

    [jiang@localhost ~]$ ./main 1048576
    OS default udp socket recv buff size is: 124928
    you want to set udp socket recv buff size to 1048576
    set udp socket(3) recv buff size to 1048576 OK!!!
    OS current udp socket(249856) recv buff size is: 249856

    可见,我们希望设置接收缓冲区大小为1024*1024B(1MB),但实际并未达到我们的效果,虽然setsockopt成功了!

    我们可以通过修改系统运行时的配置(/proc),来动态地“释放权限”,让应用程序可以设置更大的内核读写缓冲区。

    三、系统配置级修改缓冲区大小

    [jiang@localhost ~]$ su - root
    Password: 
    [root@localhost ~]# echo 262144 > /proc/sys/net/core/rmem_default
    [root@localhost ~]# echo 1048576 > /proc/sys/net/core/rmem_max
    [root@localhost ~]# logout
    [jiang@localhost ~]$ cat /proc/sys/net/core/rmem_default
    262144
    [jiang@localhost ~]$ cat /proc/sys/net/core/rmem_max
    1048576
    [jiang@localhost ~]$ ./main 1048576
    OS default udp socket recv buff size is: 262144
    you want to set udp socket recv buff size to 1048576
    set udp socket(3) recv buff size to 1048576 OK!!!
    OS current udp socket(2097152) recv buff size is: 2097152

    我们在root下,修改了系统运行时的配置:

    /proc/sys/net/core/rmem_default
    /proc/sys/net/core/rmem_max

    我们设置读缓冲区默认值为256KB,最大值为1MB。

    程序运行时,我们希望设置读缓冲区为1MB。

    通过输出信息,我们可以验证,修改/proc中的配置文件,我们使得一个socket默认的读缓冲区为256KB,读缓冲区最大值为1MB。

    setsockopt系统调用级设置受限于系统运行时配置,可以通过修改系统配置,使得程序设置更大的读写缓冲区。

    需要注意的两点:

    1.)

    当系统关机重启时,对/proc的修改,是否依然存在?

    不会。

    这就比较重要,若服务器由于异常宕机,重启后失去了原有的设置,就有可能导致接收缓冲区过小,出现UDP丢包的可能。

    2.)

    为什么我通过setsockopt设置读缓冲区值为rcvBufSize,但实际getsockopt获取的读缓冲区大小是2*rcvBufSize?

    这个是和源码有关系。

    (引用自:https://blog.csdn.net/liuguanghui1988/article/details/53375269

    case SO_SNDBUF:
    
    if (val > sysctl_wmem_max)
    
    val = sysctl_wmem_max;
    
    if ((val * 2 ) < SOCK_MIN_SNDBUF)
    
    sk->sk_sndbuf = SOCK_MIN_SNDBUF;
    
    else
    
    sk->sk_sndbuf = val * 2 ;

    系统这么做,猜测可能是由于UDP解包封包需要的额外的空间。

    所以,我称r/wmem_max为:可由程序设置的缓冲区最大值

    展开全文
  • 日志文件的顺序是:程序写入用户地址空间内核从用户地址空间缓冲区复制到内核文件缓冲区内核文件缓冲区满的情况下再放入内核io队列,等待写入到硬盘上。文件其实不是直接到硬盘,那样的话一堆程序都同时...
  • python设置文件缓冲

    千次阅读 2018-03-20 14:21:50
    设置文件的缓冲文件的...解决方案:全缓冲:open函数中的buffering设置为大于1的整数n,n为缓冲区大小行缓冲:open函数中的buffering设置为1无缓冲:open函数中的buffering设置为0举个栗子:#全缓冲:a = open('demo...
  • 在nginx中设置socket缓冲区大小

    千次阅读 2013-05-31 19:42:18
    在src/event/ngx_event_connect.c中,方法ngx_event_connect_peer(ngx_peer_connection_t *pc)里设置缓冲区大小,代码如下:if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, (const void *) &pc->rcvbuf, sizeof(int)) ...
  • fflush()函数将清除由stream指向的文件缓冲区里的内容,常用于完一些数据后,立即用该函数清除缓冲区,以免误操作时,破坏原来的数据。 flushall()将清除所有打开文件所对应的文件缓冲区。 (2).设置文件缓冲区...
  • 背景:使用命令行来修改windows 命令行窗口了的大小和屏幕缓冲区大小(宽度和高度)方法:方法是改注册表。先来看下你可以在命令行下直接指定命令行窗口的大小了,进到命令行执行 mode,可以看到关于控制台的信息...
  • 今天测试了一下读写文件缓冲区多大合适的问题,缓冲区大小并非我之前想的那样越大越好,测试后发现竟然是64KB时最快啊。下面是测试用的代码大家看一下有问题请指正:   HANDLE h = CreateFile(m_...
  • 管道缓冲区大小

    千次阅读 2019-03-30 20:56:39
    可以使用ulimit –a 命令来查看当前系统中创建管道文件所对应的内核缓冲区大小。通常为:pipe size 4K,即一个页面大小。也可以使用fpathconf函数来查看: #include <unistd.h> long fpathconf(int fd, int ...
  • 创建一个大小为4G的缓冲区文件 sudo fallocate -l 4G /swapfile 赋予权限Swap分区文件权限 sudo chmod 600 /swapfile 将swapfile初始化为交换文件 sudo mkswap /swapfile ...
  • C语言 文件缓冲区

    千次阅读 2019-07-31 16:15:57
    文件缓冲区 缓冲区分为以下三种: 1,流,标准库的IO缓冲区 文件流操作函数(File *p)直接交互的都是C 标准库IO buffer ,除open(), openat(), read(), write()等文件描述符相关的函数外,其他IO库函数进行IO...
  • Linux文件缓冲区详解

    千次阅读 2018-06-01 14:04:00
    Linux文件缓冲区详解A)缓冲区机制根据应用程序对文件的访问方式,即是否存在缓冲区,对文件的访问可以分为带缓冲区的操作和非缓冲区的文件操作:a) 带缓冲区文件操作:高级标准文件I/O操作,将会在用户空间中自动...
  • 更改系统udp缓冲区大小

    千次阅读 2019-05-16 11:35:53
    鉴于tcp有重传机制,更多的时候udp对收发缓冲区大小可能更加敏感一点。 udp缓冲区大小主要和以下几个值有关: /proc/sys/net/core/rmem_max ——— udp缓冲区的最大值,单位字节,下同 /proc/sys/...
  • linux文件缓冲区

    千次阅读 2011-01-27 11:53:00
    一:缓冲区机制根据应用程序对文件的访问方式,即是否存在缓冲区,对文件的访问可以分为带缓冲区的操作和非缓冲区文件操作:缓冲区文件操作:高级文件系统,将在用户空间中自动为正在使用的文件开辟内存缓冲区。...
  • 头文件:#include 函数setvbuf()用来设定文件流的缓冲区,其原型为: ...【参数】stream为文件流指针,buf为缓冲区首地址,type为缓冲区类型,size为缓冲区内字节的数量。 参数类型type说明如下: _IOFBF
  • 对于不使用缓存读写文件的操作(1M大小): FileOutputStream fos = new FileOutputStream(file); // BufferedOutputStream bos = new BufferedOutputStream(fos); for (int i
  • centos7更改系统udp缓冲区大小

    千次阅读 2018-05-03 17:18:15
    udp对收发缓冲区大小比较敏感:udp缓冲区大小主要和以下几个值有关:/proc/sys/net/core/rmem_max ——— udp缓冲区的最大值,单位字节,下同/proc/sys/net/core/rmem_default ——— udp缓冲区的默认值,如果不...
  • 关于linux udp收发包缓冲区大小

    万次阅读 2013-03-13 14:40:30
    1、修订单个socket的缓冲区大小:通过setsockopt使用SO_RCVBUF来设置接收缓冲区,该参数在设置的时候不会与rmem_max进行对比校验,但是如果设置的大小超过rmem_max的话,则超过rmem_max的部分不会生效; 2、修订...
  • 服务端调整WebSocket缓冲区大小

    千次阅读 2020-07-30 09:53:31
    后来我设置了tomcat的缓存大小,问题依然存在。然后我测试了一下用ajax传输图片十六进制字节到后台,果然后台服务器能够正常接收,那为什么websocket传输就有问题了呢,果然不出我所料,问题出现在websocket身上。
  • 题目:假设磁盘块与缓冲区大小相同,每个盘块读入缓冲区的时间为15μs,由缓冲区送至用户区的时间是5μs,系统对每个磁盘块数据的处理时间为2μs。若用户需要将大小为10个磁盘块的Docl文件逐块从磁盘读入缓冲区,并...
  • 文件类型分为:流文件和设备文件 设备文件比如:VGA接口,串口,usb口,网口,串口,这些接口...当我们程序的时候默认已经帮我们打开了三个文件 分别是:  stdin:标准输入 stdout:标准输出 stderr:标准出错
  • udp之关于linux udp收发包缓冲区大小

    千次阅读 2016-03-21 22:36:14
    1、修订单个socket的缓冲区大小:通过setsockopt使用SO_RCVBUF来设置接收缓冲区,该参数在设置的时候不会与rmem_max进行对比校验,但是如果设置的大小超过rmem_max的话,则超过rmem_max的部分不会生效; 2、修订...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 304,297
精华内容 121,718
关键字:

写文件设置缓冲区大小