#include #include #include #include #include #include #include #include #include #include #include main(int argc,char ** argv) { struct sockaddr_un sockaddr; char line[128]; char reply[128]; int socket_errno; int i, err, n; int s; int ret; int fd[2]; struct cmsghdr *cmsg; int *fdptr; char cmsgbuf[CMSG_SPACE(sizeof (int))]; struct iovec vec; struct msghdr msghdr; if ( socketpair( AF_UNIX, SOCK_STREAM, 0, fd ) == -1 ) { fprintf(stderr, "socketpait error\n"); } close(fd[1]); n = 0; while (1) { if ((s=socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { socket_errno = errno; fprintf(stderr,"can't create socket [%d]\n",socket_errno); exit(-1); } memset(&sockaddr, '\0', sizeof(sockaddr)); sockaddr.sun_family = AF_UNIX; strcpy(sockaddr.sun_path, "/tmp/unix_d_test"); if (connect(s,(struct sockaddr *)&sockaddr,sizeof(sockaddr)) == -1) { socket_errno = errno; fprintf(stderr,"connect error [%d]\n",errno); exit(-1); } for(i = 0 ; i < 128 ; i++) { line[i] = 0; } sprintf(line, "[%d]:client pid is %d", n, getpid()); vec.iov_base = line; vec.iov_len = 128; msghdr.msg_name = NULL; msghdr.msg_namelen = 0; msghdr.msg_iov = &vec; msghdr.msg_iovlen = 1; msghdr.msg_flags = 0; msghdr.msg_control = cmsgbuf; msghdr.msg_controllen = sizeof cmsgbuf; cmsg = CMSG_FIRSTHDR(&msghdr); cmsg->cmsg_len = CMSG_LEN(sizeof(int) * 1); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; fdptr = (int *)CMSG_DATA(cmsg); memcpy(fdptr, fd, sizeof(int) * 1); msghdr.msg_controllen = cmsg->cmsg_len; if ((ret = sendmsg(s, &msghdr, 0 )) < 128) { fprintf(stderr, "sendmsg error %d\n", errno); exit(-1); } fprintf(stderr, "[%d]:sendmsg() %d byte OK. fd:%d\n", n, ret, fd[0]); vec.iov_base = reply; vec.iov_len = 128; msghdr.msg_name = NULL; msghdr.msg_namelen = 0; msghdr.msg_iov = &vec; msghdr.msg_iovlen = 1; msghdr.msg_flags = 0; msghdr.msg_controllen = 0; msghdr.msg_control = NULL; if ((ret = recvmsg(s, &msghdr, 0)) < 128) { fprintf(stderr, "recvmsg() error %d\n", errno); exit(-1); } fprintf(stderr, "recvmgs() %d byte OK.\n", ret); close(s); n++; } fprintf(stderr,"GOOD BY \n"); exit (0); }