recvmsg()不支持的操作

时间:2011-03-24 18:08:09

标签: c linux sockets unix file-descriptor

我试图使用sendmsg,recvmsg函数在两个进程之间传递文件描述符。

我是通过在unix域中创建套接字来实现的。

当我执行它iam得到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);
}

任何人请告诉我如何解决错误..

1 个答案:

答案 0 :(得分:0)

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

Wikipedia info on Named Pipes

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