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