【问题标题】:operation not supported for recvmsg()recvmsg() 不支持操作
【发布时间】:2011-03-24 18:08:09
【问题描述】:

我正在尝试使用 sendmsg、recvmsg 函数在两个进程之间传递文件描述符..

我通过在 unix 域中创建套接字来做到这一点。

当我执行它时,我得到了 recvmsg 的操作不支持错误,它与 sendmsg 一起工作正常..

以下是代码..

    struct sockaddr_un serveraddr;
if((sfd=socket(AF_UNIX,SOCK_STREAM,0))<0)
{
    perror("socket() failed");
    unlink(SERVER_PATH);
    exit(0);
}
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sun_family = AF_UNIX;
strcpy(serveraddr.sun_path, SERVER_PATH);
if((rc = bind(sfd, (struct sockaddr *)&serveraddr, SUN_LEN(&serveraddr)))<0)
{
    perror("bind() failed");
    unlink(SERVER_PATH);
    exit(0);
}

if((rc = listen(sfd, 10))<0)
{
    perror("listen() failed");
    exit(0);
}

printf("Ready for client connect().\n");

nsfd = accept(sfd, NULL, NULL);
if (nsfd < 0)
{
    perror("accept() failed");
    unlink(SERVER_PATH);
    exit(0);
}
/*rc = setsockopt(nsfd, SOL_SOCKET, SO_RCVLOWAT,(char *)&length, sizeof(length));
if (rc < 0)
{
    perror("setsockopt(SO_RCVLOWAT) failed");
    unlink(SERVER_PATH);
    exit(0);
}*/
recv(nsfd,buffer,200,0);
printf("the data recieved from client is %s\n",buffer);

struct iovec iov[1];
struct msghdr msg;

iov[0].iov_base = (char*)0;
iov[0].iov_len=0;
msg.msg_iov=iov;
msg.msg_iovlen=1;
msg.msg_name=(caddr_t)0;
msg.msg_control=(caddr_t)&fd;
msg.msg_controllen=sizeof(fd);
if(recvmsg(nsfd,&msg,0)<0)
{
    perror("recvmsg error:");
    unlink(SERVER_PATH);
    exit(0);
}

任何人请让我知道我可以做些什么来解决这个错误..

【问题讨论】:

  • 请接受您之前问题的答案。如果您这样做,人们将更有可能愿意帮助您。
  • 我在你的代码中没有看到SCM_RIGHTS。据我所知,这是一个必要的部分......

标签: c linux sockets unix file-descriptor


【解决方案1】:

如果我没记错的话,fd 将指向一个整数,该整数在进程内是唯一的,但在该进程之外却毫无用处。你到底想达到什么目的?如果您尝试在两个进程之间重用文件句柄,您可能需要考虑创建命名管道。

Wikipedia info on Named Pipes

编辑:正如 Ben 指出的,我错了。谢谢本。

【讨论】:

  • man 7 unix 说“辅助消息使用 sendmsg(2) 和 recvmsg(2) 发送和接收辅助数据。由于历史原因,下面列出的辅助消息类型使用 SOL_SOCKET 类型指定,即使它们是 PF_UNIX 特定的。要发送它们,请将结构 cmsghdr 的 cmsg_level 字段设置为 SOL_SOCKET,并将 cmsg_type 字段设置为类型。有关更多信息,请参阅 cmsg(3)。SCM_RIGHTS"
  • "SCM RIGHTS - 从另一个进程发送或接收一组打开的文件描述符。数据部分包含文件描述符的整数数组。传递的文件描述符表现得好像它们是用 dup 创建的(2).
  • 有趣,浏览 recvmsg 上的手册页我没有抓住那个细节。感谢 Ben 的指点。
猜你喜欢
  • 2015-11-27
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
相关资源
最近更新 更多