1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| ##include <stdio.h> ##include <stdlib.h> ##include <string.h> ##include <sys/socket.h> ##include <sys/types.h> ##include <sys/mman.h> ##include <sys/un.h> ##include <unistd.h> ##include <fcntl.h> ##include <errno.h>
##define BUFFER_SIZE 1024
int main(int argc, char *argv[]) { int sock_fd; struct msghdr msg = {0}; struct iovec io = {0}; char buffer[BUFFER_SIZE] = {0};
if ((sock_fd = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(EXIT_FAILURE); }
struct sockaddr_un addr = {0}; addr.sun_family = AF_UNIX; strncpy(addr.sun_path, "/tmp/king.sock", sizeof(addr.sun_path) - 1);
if (bind(sock_fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) { perror("bind"); exit(EXIT_FAILURE); }
printf("Waiting for data...\n");
struct cmsghdr *cmsg = NULL; char cmsg_buffer[CMSG_SPACE(sizeof(int))]; memset(cmsg_buffer, 0, sizeof(cmsg_buffer)); msg.msg_control = cmsg_buffer; msg.msg_controllen = sizeof(cmsg_buffer);
io.iov_base = buffer; io.iov_len = BUFFER_SIZE; msg.msg_iov = &io; msg.msg_iovlen = 1;
if (recvmsg(sock_fd, &msg, 0) == -1) { perror("recvmsg"); exit(EXIT_FAILURE); }
printf("Received data: %s\n", buffer);
int shmem_fd; cmsg = CMSG_FIRSTHDR(&msg); if (cmsg == NULL || cmsg->cmsg_len != CMSG_LEN(sizeof(int))) { fprintf(stderr, "Invalid control message\n"); exit(EXIT_FAILURE); }
if (cmsg->cmsg_level != SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS) { fprintf(stderr, "Invalid control message\n"); exit(EXIT_FAILURE); }
shmem_fd = *(int*)CMSG_DATA(cmsg);
void *shmem_ptr;
if ((shmem_ptr = mmap(NULL, BUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shmem_fd, 0)) == MAP_FAILED) { perror("mmap"); exit(EXIT_FAILURE); }
printf("Shared memory content: %s\n", (char*)shmem_ptr);
munmap(shmem_ptr, BUFFER_SIZE); close(shmem_fd); close(sock_fd);
return 0; }
|