• 使用writev将多个小数据包合并发送,使用sysconf(_SC_IOV_MAX)查看writev函数最多允许数组大小


    服务器代码使用《select在标准输出和套接字上进行监控》里边的selectServerInTCPIPbook.c代码,gcc selectServerInTCPIPbook.c -o selectServerInTCPIPbook进行编译,然后执行./selectServerInTCPIPbook 80808080端口上监听。
    在这里插入图片描述

    关于writev的使用,可以参考《writev函数的使用测试》

    writevToSocket.c里边的代码如下:

    #include
    #include
    #include
    #include
    #include
    #include
    int main(int argc, char **argv) {
        if (argc != 3) {
            printf("usage: select01  or ");
        }
    
    
        int socket_fd;
        socket_fd = socket(AF_INET, SOCK_STREAM, 0);
    
        struct sockaddr_in server_addr;
        bzero(&server_addr, sizeof(server_addr));
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(atoi(argv[2]));
        inet_pton(AF_INET, argv[1], &server_addr.sin_addr);
    
        socklen_t server_len = sizeof(server_addr);
        int connect_rt = connect(socket_fd, (struct sockaddr *) &server_addr, server_len);
        if (connect_rt < 0) {
            printf("connect failed ");
            exit(1);
        }
    
        char buf[128];
        struct iovec iov[2];
    
        char *send_one = "hello,";
        iov[0].iov_base = send_one;
        iov[0].iov_len = strlen(send_one);
        iov[1].iov_base = buf;
        while (fgets(buf, sizeof(buf), stdin) != NULL) {
            iov[1].iov_len = strlen(buf)-1;//将键盘输入的回车符截掉
            int n = htonl(iov[1].iov_len);
            if (writev(socket_fd, iov, 2) < 0)
                printf("writev failure");
        }
        exit(0);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    这段代码会向服务器端发送hello,加上你输入的字符串,比如你要是输入了test,那么往服务器端发送的是hello,test
    gcc writevToSocket.c -o writevToSocket将代码进行编译,然后./writevToSocket 127.0.0.1 8080运行程序,然后输入想要发送的字符串之后,按下回车键。
    在这里插入图片描述

    sysconfTest.c代码如下:

    #include
    #include
    
    int main(int argc,char *argv[]){
            printf("%ld\n",sysconf(_SC_IOV_MAX));
            return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    gcc sysconfTest.c -o sysconfTest将代码进行编译,./sysconfTest显示出来的结果就是writev 函数一次性最多允许数组的大小
    在这里插入图片描述

    此文章为11月Day 20学习笔记,内容来源于极客时间《网络编程实战》

  • 相关阅读:
    Java项目:ssm大学生兼职论坛
    100个Java工具类之61:队列类Queue
    使用poi操作excel详解
    三百六十行行行出状元之短视频入门必备技巧——配音
    算法系列--递归
    微信小程序项目源码ssm校园二手交易小程序+后台管理系统|前后分离VUE含论文+PPT+源码
    Linux安装及使用
    数据库、数据仓库相关
    PMO大会的主办方是PMO评论
    网络安全渗透测试之pingtunnel使用实验
  • 原文地址:https://blog.csdn.net/qq_42108074/article/details/134510549