операция не поддерживается для recvmsg () - PullRequest
0 голосов
/ 24 марта 2011

Я пытаюсь передать дескриптор файла между двумя процессами, используя функции 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);
}

любой, пожалуйста, дайте мне знать, что я могу сделать, чтобы решитьошибка ..

1 Ответ

0 голосов
/ 25 марта 2011

Если я не ошибаюсь, fd будет указывать на целое число, уникальное внутри процесса, но совершенно бесполезное вне этого процесса.Что именно вы пытаетесь достичь?Если вы пытаетесь повторно использовать дескриптор файла между двумя процессами, вам может потребоваться создать именованный канал.

Информация из Википедии об именованных каналах

Редактировать:Как указывает Бен, я ошибаюсь.Спасибо Бен.

...