sendmsg发送文件描述符提示Bad address

void send_fd( int fd, int fd_to_send )
{
   
    struct iovec iov[1];
    struct msghdr msg;
    char buf[0];
    int ret;

    iov[0].iov_base = buf;
    iov[0].iov_len = 1;
    msg.msg_name    = NULL;
    msg.msg_namelen = 0;
    msg.msg_iov     = iov;
    msg.msg_iovlen = 1;

    cmsghdr cm;
    cm.cmsg_len = CONTROL_LEN;
    cm.cmsg_level = SOL_SOCKET;
    cm.cmsg_type = SCM_RIGHTS;
    *(int *)CMSG_DATA( &cm ) = fd_to_send;
    msg.msg_control = &cm;
    msg.msg_controllen = CONTROL_LEN;

    ret = sendmsg( fd, &msg, 0 );
    if(ret < 0) {
        printf("sendmsg error, errno is %d\n", errno);
        printf("%s\n",strerror(errno));
        printf ("ret = %d, filedescriptor = %d\n", ret, fd_to_send);
    }
}

int recv_fd( int fd )
{
    struct iovec iov[1];
    struct msghdr msg;
    char buf[0];
    int ret;

    iov[0].iov_base = buf;
    iov[0].iov_len = 1;
    msg.msg_name    = NULL;
    msg.msg_namelen = 0;
    msg.msg_iov     = iov;
    msg.msg_iovlen = 1;

    cmsghdr cm;
    msg.msg_control = &cm;
    msg.msg_controllen = CONTROL_LEN;

    ret = recvmsg( fd, &msg, 0 );
    if( ret <= 0 ) {
        printf("recvmsg error, errno is %d\n", errno);
        printf("%s\n",strerror(errno));
        printf ("ret = %d, filedescriptor = %d\n", ret, fd);
    }

    int fd_to_read = *(int *)CMSG_DATA( &cm );
    return fd_to_read;
    
}
阅读 2.5k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题