- 论坛徽章:
- 0
|
各位大侠:
我在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);
} |
|