From ca312c023b11d7885227addc7564494998d8898c Mon Sep 17 00:00:00 2001 From: cheliequan <liequanche@126.com> Date: 星期三, 28 十二月 2022 13:31:58 +0800 Subject: [PATCH] 更新ipc client库和使用示例 --- src/ipc_client_lib.c | 73 ++++++++++++++++++ src/ipc_client.c | 109 +++----------------------- src/Makefile | 10 +- src/ipc_server.c | 11 +- 4 files changed, 98 insertions(+), 105 deletions(-) diff --git a/src/Makefile b/src/Makefile index d870100..62eef2d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -9,11 +9,11 @@ shmht: shmht.o memfd.o $(CC) -o libshmht.so $(CFLAGS) -shared $^ $(AR) rcs libshmht.a $^ -shmht.o: shmht.c shmht.h +shmht.o: shmht.c $(CC) $(CFLAGS) $(INCLUDE) -fPIC -c shmht.c shmht_mytests: shmht_mytests.o shmht.o memfd.o $(CC) $(CFLAGS) $(INCLUDE) -L . -pthread -o $@ $^ -shmht_mytests.o: shmht.h +shmht_mytests.o: $(CC) $(CFLAGS) $(INCLUDE) -fPIC -c shmht_mytests.c memfd.o: $(CC) $(CFLAGS) $(INCLUDE) -fPIC -c memfd.c @@ -21,7 +21,9 @@ $(CC) $(CFLAGS) $(INCLUDE) -fPIC -pthread -o $@ ipc_server.c -lipc_server -L . libipc_server.so: $(CC) -shared -fPIC -o $@ ipc_server_lib.c ipc_msg.c memfd.c -ipc_client: - $(CC) $(CFLAGS) $(INCLUDE) -fPIC -o $@ ipc_client.c ipc_msg.c memfd.c +ipc_client:libipc_client.so + $(CC) $(CFLAGS) $(INCLUDE) -fPIC -o $@ ipc_client.c ipc_msg.c memfd.c -lipc_client -L . +libipc_client.so: + $(CC) -shared -fPIC -o $@ ipc_client_lib.c ipc_msg.c memfd.c clean: rm -rf *.so *.o a.out shmht_mytests *.a ipc_client ipc_server diff --git a/src/ipc_client.c b/src/ipc_client.c index aeb2490..e9809c3 100644 --- a/src/ipc_client.c +++ b/src/ipc_client.c @@ -1,56 +1,17 @@ #include <stdio.h> -#include <stdlib.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <unistd.h> -#include <sys/syscall.h> -#include <sys/mman.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <string.h> -#include <stdio.h> -#include <sys/inotify.h> -#include <sys/time.h> -#include <errno.h> +#include "memfd.h" #include "ipc_msg.h" - -#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \ -} while (0) - - -int memfd_open(char* fd_path) -{ - ssize_t len; - int fd; - struct stat st; - fd = open(fd_path, O_RDWR); - if (fd == -1) - errExit("open"); - - if (fstat (fd, &st)) - errExit ("fstat"); - len = st.st_size; - - printf("length: %zu, atime: %lu.%lu\n", len, st.st_atim.tv_sec, st.st_atim.tv_nsec); - - return fd; -} int memfd_read(int fd) { unsigned char* addr; - struct stat st; - ssize_t i, len; - if (fstat (fd, &st)) - errExit ("fstat"); - len = st.st_size; - - addr = (unsigned char*) mmap (NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (addr == MAP_FAILED) - errExit("mmap"); - + len = basic_shm_mmap(fd, &addr); + if(len < 0) + { + return -1; + } printf ("start: "); for (i = 0; i < 32; ++i) printf ("%i ", addr[i]); @@ -61,75 +22,33 @@ return len; } + int main(int argc, char **argv) { - int fd; - int connect_fd; - struct sockaddr_un srv_addr; - char snd_buf[MAX_LEN] = {0}; - char rcv_buf[MAX_LEN] = {0}; + int fd = 0; int ret; int i; char *fd_path; memfd_data_st memfd_data = {0}; int rcv_num = 0; - connect_fd = socket(AF_UNIX, SOCK_STREAM, 0); - - if(connect_fd < 0) + ret = basic_create_ipc_client(UNIX_DOMAIN, &memfd_data); + if(ret < 0) { - perror("client create socket failed"); - return 1; + return ret; } - srv_addr.sun_family = AF_UNIX; - strcpy(srv_addr.sun_path, UNIX_DOMAIN); - ret = connect(connect_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr)); - - if(ret == -1) - { - perror("connect to server failed!"); - close(connect_fd); - unlink(UNIX_DOMAIN); - return 1; - } - - printf("connect to server path:%s success!", srv_addr.sun_path); - - //memset(rcv_buf, 0, sizeof(rcv_buf)); - //int rcv_num = read(connect_fd, rcv_buf, sizeof(rcv_buf)); - //memcpy(&memfd_data, rcv_buf, sizeof(memfd_data_st)); - - memset(snd_buf, 0, 256); - strcpy(snd_buf, HELLO_MSG); - printf("sizeof(snd_buf): %ld\n", sizeof(snd_buf)); - - printf("send data to server... ...\n"); - // for(i = 0; i < 4; i++) - { - write(connect_fd, snd_buf, sizeof(snd_buf)); - } - printf("send end!\n"); - - - memset(rcv_buf, 0, sizeof(rcv_buf)); - rcv_num = read(connect_fd, rcv_buf, sizeof(rcv_buf)); - if(rcv_num == 0) - { - close(connect_fd); - return 0; - } - memcpy(&memfd_data, rcv_buf, rcv_num); printf("receive message from server,pid:%d, memfd:%d\n", memfd_data.pid, memfd_data.memfd); if ((memfd_data.pid != 0) && (memfd_data.memfd != 0)) { char fd_path[256] = {0}; snprintf(fd_path, sizeof(fd_path), "/proc/%d/fd/%d", memfd_data.pid, memfd_data.memfd); - fd = memfd_open(fd_path); + fprintf(stderr,"fd_path:%s\n", fd_path); + fd = basic_shm_open(memfd_data.memfd, memfd_data.pid , 1); ret = memfd_read(fd); } - close(connect_fd); + basic_shm_close(fd); return 0; } diff --git a/src/ipc_client_lib.c b/src/ipc_client_lib.c new file mode 100644 index 0000000..ae6aac1 --- /dev/null +++ b/src/ipc_client_lib.c @@ -0,0 +1,73 @@ +#include <stdio.h> +#include <stdlib.h> +#include <sys/socket.h> +#include <sys/un.h> +#include <unistd.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <string.h> +#include <stdio.h> +#include <errno.h> +#include "ipc_msg.h" + +int basic_create_ipc_client(char * unix_domain_path, memfd_data_st * ptr_memfd_data) +{ + int fd; + int connect_fd; + struct sockaddr_un srv_addr; + char snd_buf[MAX_LEN] = {0}; + char rcv_buf[MAX_LEN] = {0}; + int ret; + int i; + char *fd_path; + int rcv_num = 0; + + connect_fd = socket(AF_UNIX, SOCK_STREAM, 0); + + if(connect_fd < 0) + { + perror("client create socket failed"); + return 1; + } + srv_addr.sun_family = AF_UNIX; + + if(unix_domain_path == NULL) + { + unix_domain_path = UNIX_DOMAIN; + } + + strcpy(srv_addr.sun_path, unix_domain_path); + ret = connect(connect_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr)); + if(ret == -1) + { + perror("connect to server failed!"); + close(connect_fd); + unlink(UNIX_DOMAIN); + return 1; + } + + printf("connect to server path:%s success!", srv_addr.sun_path); + + //memset(rcv_buf, 0, sizeof(rcv_buf)); + //int rcv_num = read(connect_fd, rcv_buf, sizeof(rcv_buf)); + //memcpy(&memfd_data, rcv_buf, sizeof(memfd_data_st)); + + memset(snd_buf, 0, 256); + strcpy(snd_buf, HELLO_MSG); + printf("sizeof(snd_buf): %ld\n", sizeof(snd_buf)); + + printf("send data to server... ...\n"); + write(connect_fd, snd_buf, sizeof(snd_buf)); + printf("send end!\n"); + + memset(rcv_buf, 0, sizeof(rcv_buf)); + rcv_num = read(connect_fd, rcv_buf, sizeof(rcv_buf)); + if(rcv_num == 0) + { + close(connect_fd); + return 0; + } + memcpy(ptr_memfd_data, rcv_buf, rcv_num); + + close(connect_fd); +} diff --git a/src/ipc_server.c b/src/ipc_server.c index 99418c7..0d8178a 100644 --- a/src/ipc_server.c +++ b/src/ipc_server.c @@ -1,11 +1,10 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> #include <signal.h> #include <sys/types.h> #include <sys/stat.h> +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <errno.h> #include "memfd.h" #include "ipc_msg.h" @@ -134,6 +133,6 @@ printf("failed to create ipc_server\n"); } - basic_shm_close(g_memfd); + // basic_shm_close(g_memfd); return 0; } -- Gitblit v1.8.0