免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1029 | 回复: 0
打印 上一主题 下一主题

[SCO UNIX] 紧急求助:unixware7.10下用sendmsg传递socket出错! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-12-26 15:25 |只看该作者 |倒序浏览
各位大侠:
      我在SCO UNIX 5.0.*上有一段程序,是用来在多个进程之间传递套接字,用的是sendmsg和recvmsg两个函数完成。使用完全正常,但是移植到unixware上面来以后,sendmsg报错:无效的参数。程序如下,请高手帮我指点指点,非常感谢!

#define  NOHAVE_CMSGHDR
/*
*        通过管道发送socket
*/
//pfd是socketpair建立的管道,fd是需要传递的socket套接字

int SendSocketToChld(pfd, fd)           //
int    pfd;
int    fd;
{
        struct msghdr msg;
        int n;

    #ifdef    HAVE_CMSGHDR
        union {
            struct cmsghdr cm;
            char control[ CMSG_SPACE(sizeof(int)) ];
        } u_control;
        struct cmsghdr *pcm;
   
        msg.msg_control   = (caddr_t) (u_control.control);
        msg.msg_controllen =CMSG_SPACE(sizeof(int ));
   
        pcm = CMSG_FIRSTHDR ( &msg );
        pcm->;cmsg_level = SOL_SOCKET;
        pcm->;cmsg_len  = CMSG_SPACE(sizeof(int ));
        pcm->;cmsg_type = SCM_RIGHTS;
        *((int*) CMSG_DATA(pcm)) = fd;
    #else        /*HAVE_CMSGDHR            */
        msg.msg_control   = (caddr_t) &
        msg.msg_controllen = sizeof fd;
    #endif        /* HAVE_CMSGHDR            */

        msg.msg_name    = NULL;
        msg.msg_namelen = 0;
        msg.msg_iov     = NULL;
        msg.msg_iovlen  = 0;
        msg.msg_flags   = 0;
   
        n = sendmsg(pfd, &msg, 0);
        if ( n < 0 )
            return (-1);   
        return(0);   
}


/*
*        通过管道接收socket
*/
int RecvSocketFromMain(char *fd)
{
        struct msghdr msg;
        int n, newfd = -1;
        int                pfd;

                pfd = atoi ( fd );
    #ifdef     HAVE_CMSGHDR
        union {
            struct cmsghdr cm;
            char control[ CMSG_SPACE(sizeof(int)) ];
        } u_control;
        struct cmsghdr *pcm;
      
        msg.msg_control = u_control.control;
        msg.msg_controllen = sizeof ( u_control.control );
    #else        /*HAVE_CMSGHDR        */
        msg.msg_control = (caddr_t)&
        msg.msg_controllen = sizeof newfd;
    #endif        /*HAVE_CMSGHDR        */

        msg.msg_name   = NULL;
        msg.msg_namelen = 0;
        msg.msg_iov     =  NULL;
        msg.msg_iovlen  =  0;

        n = recvmsg(pfd, &msg, 0);
        if ( n < 0 )
            return (-1);
   
    #ifdef    HAVE_CMSGHDR
        pcm = CMSG_FIRSTHDR ( &msg );
        if ( pcm->;cmsg_level == SOL_SOCKET &&
            pcm->;cmsg_type == SCM_RIGHTS ) {
            newfd =    *((int*) CMSG_DATA(pcm));
        }
        else {
            newfd = (int) -1;
        }
    #endif        /*HAVE_CMSGHDR        */
        return (newfd);   
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP