#include #include #include #include "memfd.h" #include "ipc_msg.h" int memfd_read(int fd) { unsigned char* addr; ssize_t i, len; len = basic_shm_mmap(fd, &addr); if(len < 0) { return -1; } printf ("start: "); for (i = 0; i < 32; ++i) printf ("%i ", addr[i]); printf ("\nend: "); for (i = 0; i < 32; ++i) printf ("%i ", addr[len-32+i]); printf ("\ndone\n"); return len; } int main(int argc, char **argv) { int fd = 0; int ret; int recv_len = 0; memfd_data_st memfd_data = {0}; char snd_buf[MAX_LEN] = {0}; char * unix_domain_path = NULL; char *recv_buf = (char *)malloc(MAX_LEN); /*client get memfd from server*/ memset(snd_buf, 0, sizeof(snd_buf)); strncpy(snd_buf, GET_MEMFD_MSG, strlen(GET_MEMFD_MSG) + 1); printf("snd_buf: %s\n", snd_buf); memset(recv_buf, 0, MAX_LEN); unix_domain_path = UNIX_DOMAIN; ret = basic_create_ipc_client(unix_domain_path, snd_buf, strlen(snd_buf), (void **)&recv_buf, &recv_len); if(ret < 0) { return ret; } memcpy(&memfd_data, recv_buf, sizeof(memfd_data)); 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); fprintf(stderr,"fd_path:%s\n", fd_path); fd = basic_shm_open(memfd_data.memfd, memfd_data.pid, 1); ret = memfd_read(fd); } basic_shm_close(fd); /*client get memfd and custom data from server*/ #if 1 memset(snd_buf, 0, sizeof(snd_buf)); strncpy(snd_buf, GET_CUSTOM_MSG, strlen(GET_CUSTOM_MSG) + 1); printf("\nsnd_buf: %s\n", snd_buf); memset(recv_buf, 0, MAX_LEN); unix_domain_path = UNIX_DOMAIN; ret = basic_create_ipc_client(unix_domain_path, snd_buf, strlen(snd_buf), (void **)&recv_buf, &recv_len); if(ret < 0) { return ret; } memcpy(&memfd_data, recv_buf, sizeof(memfd_data)); if(memfd_data.len > 0) { memfd_data.data = malloc(memfd_data.len); memcpy(memfd_data.data, recv_buf+sizeof(memfd_data), memfd_data.len); } 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); fprintf(stderr,"fd_path:%s\n", fd_path); fd = basic_shm_open(memfd_data.memfd, memfd_data.pid, 1); ret = memfd_read(fd); } basic_shm_close(fd); fprintf(stderr,"custom data:%s\n", (char *)memfd_data.data); if(memfd_data.len > 0) { free(memfd_data.data); } #endif #if 1 /*client get usedata from server*/ memset(snd_buf, 0, sizeof(snd_buf)); strncpy(snd_buf, GET_DATA_MSG, strlen(GET_DATA_MSG) + 1); printf("\nsnd_buf: %s\n", snd_buf); memset(recv_buf, 0, MAX_LEN); recv_len = 0; //unix_domain_path="/tmp/unix_domain_usedata"; ret = basic_create_ipc_client(unix_domain_path, snd_buf, strlen(snd_buf), (void **)&recv_buf, &recv_len); if(ret < 0) { return ret; } printf("receive message from server msg:%s\n", recv_buf); /*deal the recv_buf*/ #endif free(recv_buf); return 0; }