(10) 如何获取 linux 系统上的 TCP 、 UDP 套接字的收发缓存的默认大小,以及代码范例,补充 windows 系统上的同样的测试

(1) 先介绍下后面的代码里要用到的基础函数:

在这里插入图片描述

++ 以及:

在这里插入图片描述

++

在这里插入图片描述

(2) 接着给出现代版的 读写 socket 参数的系统函数 :

在这里插入图片描述

++ 以及:

在这里插入图片描述

(3) 给出 一言的 范例代码,获取当代 linux 系统的 tcp 套接字的缓存大小:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>

int main() 
{
    int sockfd , sndbuf, rcvbuf ;        socklen_t optlen;
    
    sockfd = socket(AF_INET, SOCK_STREAM, 0);  // 创建一个 TCP 套接字
    if (sockfd < 0) {   perror("socket");    exit(EXIT_FAILURE);  }

    // 获取发送缓存大小
    optlen = sizeof(sndbuf);
    if (getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (void *)&sndbuf, &optlen) < 0) {
        perror("getsockopt SO_SNDBUF");
        close(sockfd);       exit(EXIT_FAILURE);
    }
    printf("Send buffer size: %d bytes\n", sndbuf);

    // 获取接收缓存大小
    optlen = sizeof(rcvbuf);
    if (getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (void *)&rcvbuf, &optlen) < 0) {
        perror("getsockopt SO_RCVBUF");
        close(sockfd);        exit(EXIT_FAILURE);
    }
    printf("Receive buffer size: %d bytes\n", rcvbuf);

    close(sockfd);  // 关闭套接字

    return 0;
}

++ 给出 ubantu 的打印结果( 跟 30 年前的 伯克利系统里的缓存设置,已经有了很大的差别)

在这里插入图片描述

++ 以下是 30 年前的 tcp/ip 协议的系统缓存设置:

在这里插入图片描述

(4)

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>

#pragma warning(disable : 4996) // 禁用关于 inet_addr 的过时警告

int main()
{	
	WSADATA m_wsadata; // 在 windows平台使用 socket前,须做一下初始化,
	WSAStartup(0x0202, &m_wsadata); // 最后用 WSACleanup() 释放库。

	SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	int buffer_size = 0; int len = sizeof(buffer_size);
	
	getsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&buffer_size, &len);
	printf("windows 套接字的默认接收缓存的大小为 %d\n", buffer_size);

	getsockopt(s, SOL_SOCKET, SO_SNDBUF, (char*)&buffer_size, &len);
	printf("windows 套接字的默认发送缓存的大小为 %d\n", buffer_size);

	buffer_size = 2048;
	setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&buffer_size, sizeof(buffer_size));
	getsockopt(s, SOL_SOCKET, SO_RCVBUF, (char*)&buffer_size, &len);
	printf("想给监听套接字设置接收缓存为 2048字节,实际被调整为 %d\n", buffer_size);

	closesocket(s); // 关闭套接字的函数
	WSACleanup();         // 用这个函数关闭库
	return 0;
}

++ 图片版本,还要设置链接库,否则无法运行:

在这里插入图片描述

++测试结果如下:

在这里插入图片描述

(5)再测试一下 windows 的 UDP 套接字

在这里插入图片描述

++ 感觉没有 linux 的套接字,网络协议设计的完善。

(6)

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值