首页 > 解决方案 > 将字符串传递给 kernel_sendmsg 时应该遵循什么格式?

问题描述

最近,我正在修改内核空间中的一些套接字程序。以下是基本的服务器发送功能:

static int http_server_send(struct socket *sock, const char *buf, size_t size)
{
    struct msghdr msg = {.msg_name = NULL,
                         .msg_namelen = 0,
                         .msg_control = NULL,
                         .msg_controllen = 0,
                         .msg_flags = 0};
    int done = 0;
    while (done < size) {
        struct kvec iov = {
            .iov_base = (void *) ((char *) buf + done),
            .iov_len = size - done,
        };
        int length = kernel_sendmsg(sock, &msg, &iov, 1, iov.iov_len);
        if (length < 0) {
            pr_err("write error: %d\n", length);
            break;
        }
        done += length;
    }
    return done;
}

当它被传递时,我发现bufiov_base遵循了一些特定的格式,格式就像定义为宏( CRLF 定义为 "\r\n" ):

    ""                                                        \
    "HTTP/1.1 200 OK" CRLF "Server: " KBUILD_MODNAME CRLF     \
    "Content-Type: text/plain" CRLF "Content-Length: %d" CRLF \
    "Connection: Close" CRLF CRLF "%s" CRLF

上面的某些格式似乎无法更改(更改后将无法发送消息),也许这是一种协议。我的问题是有任何文件或参考资料可以找到这些格式的规定吗?

标签: csocketslinux-kernel

解决方案


推荐阅读