#include #include #include #include #include #include #include #include #include #include #include #include main(int argc,char ** argv) { int s; struct sockaddr_un sockaddr; char line[128]; char reply[128]; int socket_errno; int i, err; int flags; fd_set read_set, read_cur; int max_fd; int ret; struct iovec vec; struct msghdr msghdr; int client_fd; struct cmsghdr *cmsg; int *pass_fd_ptr; char cmsgbuf[CMSG_SPACE(sizeof (int))]; if ((s=socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { socket_errno = errno; fprintf(stdout,"can't create socket [%d]\n",socket_errno); exit(-1); } unlink("/tmp/unix_d_test"); memset(&sockaddr, '\0', sizeof(sockaddr)); sockaddr.sun_family = AF_UNIX; strcpy(sockaddr.sun_path, "/tmp/unix_d_test"); if (bind(s,(struct sockaddr *)&sockaddr, sizeof(sockaddr)) < 0) { socket_errno = errno; fprintf(stdout,"can't bind socket [%d]\n",errno); exit(-1); } if (listen(s, 10) < 0) { fprintf(stdout, "listen() error %d\n", socket_errno); exit(-1); } FD_ZERO(&read_set); FD_SET(s, &read_set); max_fd = s; client_fd = -1; for(;;) { for(i = 0 ; i < 128 ; i++) { line[i] = 0; } read_cur = read_set; ret = select(max_fd+1, &read_cur, NULL, NULL, NULL); if (ret == -1) { fprintf(stdout, "select() error %d\n", errno); continue; } for (i = 0; i <= max_fd; i++) { if (FD_ISSET(i, &read_cur)) { if (i == s) { struct sockaddr_un address; int len; if (client_fd != -1) { close(client_fd); } len = sizeof(struct sockaddr_un); client_fd = accept(s, (struct sockaddr *)&address, &len); if (client_fd == -1) { fprintf(stdout, "accept() error %d\n", errno); exit(-1); } if ( client_fd > max_fd ) max_fd = client_fd; } else if (i == client_fd) { fprintf(stdout, "read from client_fd\n"); } msghdr.msg_name = NULL; msghdr.msg_namelen = 0; msghdr.msg_iov = &vec; msghdr.msg_iovlen = 1; msghdr.msg_control = cmsgbuf; msghdr.msg_controllen = sizeof(cmsgbuf); vec.iov_base = line; vec.iov_len = 128; if ((ret = recvmsg(client_fd, &msghdr, 0)) < 128) { fprintf(stdout, "recvmsg() error %d\n", errno); exit(-1); } for (cmsg = CMSG_FIRSTHDR(&msghdr); cmsg != NULL; cmsg = CMSG_NXTHDR(&msghdr, cmsg)) { if (cmsg->cmsg_level == SOL_SOCKET) { pass_fd_ptr = (int *)CMSG_DATA(cmsg); break; } } fprintf(stdout, "recvmsg() is done.\n"); close(*pass_fd_ptr); msghdr.msg_name = NULL; msghdr.msg_namelen = 0; msghdr.msg_iov = &vec; msghdr.msg_iovlen = 1; msghdr.msg_controllen = 0; msghdr.msg_control = NULL; vec.iov_base = reply; vec.iov_len = 128; if ((ret = sendmsg(client_fd, &msghdr, 0 )) < 128) { fprintf(stdout, "sendmsg error %d\n", errno); exit(-1); } fprintf(stdout, "sendmsg() %d byte OK. \n", ret); FD_ZERO(&read_set); FD_SET(s, &read_set); break; } } } fprintf(stdout,"GOOD BY \n"); exit (0); }