使用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);
}

这段代码会向服务器端发送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;
}

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

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

你可能感兴趣的:(网络编程实战,网络)