C 设置复杂马赫数消息头

C 设置复杂马赫数消息头,c,macos,ipc,mach,C,Macos,Ipc,Mach,我正在尝试设置一个mach消息,用于使用mach IPC发送一个线外字符串。但是,在尝试发送越界消息时,我收到一个(ipc/send)无效消息头错误 这是消息结构 struct ool_msg { mach_msg_header_t header; mach_msg_body_t body; mach_msg_ool_descriptor_t data; mach_msg_type_number_t count; }; 我正在这样设置标题。下面的变量msg是一个

我正在尝试设置一个mach消息,用于使用mach IPC发送一个线外字符串。但是,在尝试发送越界消息时,我收到一个
(ipc/send)无效消息头
错误

这是消息结构

struct ool_msg
{
    mach_msg_header_t header;
    mach_msg_body_t body;
    mach_msg_ool_descriptor_t data;
    mach_msg_type_number_t count;
};
我正在这样设置标题。下面的变量
msg
是一个
struct ool\u msg

hdr = &(msg.header);
hdr->msgh_bits = MACH_MSGH_BITS_LOCAL(MACH_MSG_TYPE_COPY_SEND);
hdr->msgh_bits |= MACH_MSGH_BITS_COMPLEX;
hdr->msgh_size = sizeof(msg);
hdr->msgh_local_port = MACH_PORT_NULL;
hdr->msgh_remote_port = port;
这就是我设置马赫数信息其余部分的方式

msg.body.msgh_descriptor_count = 1;
msg.data.address = string;
msg.data.size = strlen(string) + 1;
msg.data.deallocate = FALSE;
msg.data.copy = MACH_MSG_VIRTUAL_COPY;
msg.data.type = MACH_MSG_OOL_DESCRIPTOR;
msg.count = msg.data.size;
那么,如何正确设置OOL Mach IPC的消息头

编辑 这是一个重现我问题的程序

#include <stdio.h>
#include <mach/mach.h>

static char *string = "123456789";

struct ool_msg
{
    mach_msg_header_t header;
    mach_msg_body_t body;
    mach_msg_ool_descriptor_t data;
    mach_msg_type_number_t count;
};

int main(void)
{
    kern_return_t err;
    struct ool_msg msg;
    mach_msg_header_t *hdr;
    mach_port_t port = MACH_PORT_NULL;

    err = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port);
    if(err != KERN_SUCCESS)
    {
        mach_error("Can't allocate mach port\n", err);
        return (-1);
    }

    err = mach_port_insert_right(mach_task_self(), port, port,
                                 MACH_MSG_TYPE_MAKE_SEND);
    if(err != KERN_SUCCESS)
    {
        mach_error("Can't insert port right\n", err);
        return (-1);
    }

    hdr = &(msg.header);
    hdr->msgh_bits = MACH_MSGH_BITS_LOCAL(MACH_MSG_TYPE_COPY_SEND);
    hdr->msgh_bits |= MACH_MSGH_BITS_COMPLEX;
    hdr->msgh_size = sizeof(msg);
    hdr->msgh_local_port = MACH_PORT_NULL;
    hdr->msgh_remote_port = port;

    msg.body.msgh_descriptor_count = 1;
    msg.data.address = string;
    msg.data.size = strlen(string) + 1;
    msg.data.deallocate = FALSE;
    msg.data.copy = MACH_MSG_VIRTUAL_COPY;
    msg.data.type = MACH_MSG_OOL_DESCRIPTOR;
    msg.count = msg.data.size;

    err = mach_msg(hdr,
                  MACH_SEND_MSG,
                  hdr->msgh_size,
                  0,
                  MACH_PORT_NULL,
                  MACH_MSG_TIMEOUT_NONE,
                  MACH_PORT_NULL);
    if(err != KERN_SUCCESS)
    {
        mach_error("Can't send mach msg\n", err);
        return (-1);
    }

    return (0);
}
#包括
#包括
静态字符*string=“123456789”;
结构工具
{
马赫数消息头;
机器本体;
马赫数工具描述符数据;
马赫数、信号类型、数量、计数;
};
内部主(空)
{
内核返回错误;
结构ool_msg msg;
马赫数消息头hdr;
马赫数端口=马赫数端口为空;
err=mach\u port\u allocate(mach\u task\u self(),mach\u port\u RIGHT\u RECEIVE,&port);
if(err!=KERN_SUCCESS)
{
马赫数错误(“无法分配马赫数端口”,错误);
返回(-1);
}
err=mach\u port\u insert\u right(mach\u task\u self(),port,port,
MACH_MSG_TYPE_MAKE_SEND);
if(err!=KERN_SUCCESS)
{
马赫数错误(“无法正确插入端口”,错误);
返回(-1);
}
hdr=&(消息头);
hdr->msgh\U位=马赫数msgh\U位\U本地(马赫数MSG\U类型\U复制\U发送);
hdr->msgh|U位|=马赫|msgh|U位|复合;
hdr->msgh_size=sizeof(msg);
hdr->msgh_本地_端口=马赫_端口_NULL;
hdr->msgh\U远程\U端口=端口;
msg.body.msgh_描述符_计数=1;
msg.data.address=字符串;
msg.data.size=strlen(字符串)+1;
msg.data.deallocate=FALSE;
msg.data.copy=马赫数msg虚拟拷贝;
msg.data.type=MACH\u msg\u OOL\u描述符;
msg.count=msg.data.size;
err=马赫数msg(hdr,
发送消息,
hdr->msgh\U尺寸,
0,
马赫数端口为空,
马赫数消息超时无,
马赫数(零端口);
if(err!=KERN_SUCCESS)
{
马赫数错误(“无法发送马赫数消息”,错误);
返回(-1);
}
返回(0);
}
作为状态:

MACH\u MSGH\u BITS\u REMOTE
MACH\u MSGH\u BITS\u LOCAL
宏返回 给定
msgh\u位
值,适当的
mach\u msg\u type\u name\t值。这个
MACH\u MSGH\u位
宏为
MSGH\u位
构造一个值,给定两个
mach\u msg\u type\u name\t

因此,在设置
MACH\u MSGH\u头MSGH\u位时,需要使用
MACH\u MSGH\u位
宏,而不是
MACH\u MSGH\u位
宏。否则,您将其设置为
mach\u msg\u type\u name\u t
,而不是您想要的
msgh\u位

为了澄清这一点,您需要以下代码来获取msgh_位:

hdr->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND)
作为缔约国:

MACH\u MSGH\u BITS\u REMOTE
MACH\u MSGH\u BITS\u LOCAL
宏返回 给定
msgh\u位
值,适当的
mach\u msg\u type\u name\t值。这个
MACH\u MSGH\u位
宏为
MSGH\u位
构造一个值,给定两个
mach\u msg\u type\u name\t

因此,在设置
MACH\u MSGH\u头MSGH\u位时,需要使用
MACH\u MSGH\u位
宏,而不是
MACH\u MSGH\u位
宏。否则,您将其设置为
mach\u msg\u type\u name\u t
,而不是您想要的
msgh\u位

为了澄清这一点,您需要以下代码来获取msgh_位:

hdr->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND)

你到底是如何发送字符串的?你能创建一个吗?@JoshdeKock我添加了一个例子。你到底是如何发送字符串的?你能创建一个新的吗?@JoshdeKock我添加了一个例子。