一个linux下socket通信的库:
http://tiaozhanshu.net/wp-content/uploads/2010/07/sock.h
http://tiaozhanshu.net/wp-content/uploads/2010/07/sock.c
一个linux下共享内存的库:
http://tiaozhanshu.net/wp-content/uploads/2010/07/shm.h
http://tiaozhanshu.net/wp-content/uploads/2010/07/shm.c
一个linux下信号量的库:
http://tiaozhanshu.net/wp-content/uploads/2010/07/sem.h
http://tiaozhanshu.net/wp-content/uploads/2010/07/sem.c
混合使用的例子:
src:http://tiaozhanshu.net/wp-content/uploads/2010/07/src.zip
Server程序注解
#include “../lib/sock.h”
#include <stdio.h> #include <string.h> void callback(int sock_id, int event, void * buf, int len, void * callbackdata) { char cmd[] = "get_data"; switch(event){ case SOCK_CONNECT: printf("server send: %s\n", cmd); send_socket(sock_id, cmd, strlen(cmd)+1); break; case SOCK_DATAREADY: printf("server receive: %s\n", buf); break; case SOCK_DISCONNECT: break; } return; } int main() { sock_server_bind(8800, 2, callback, NULL);/*sock库,创建TCP服务端,当有事件发生时会调用callback函数*/ sleep(100); return 0; }Bridge程序注解:#define SHM_DIR "./s" #include "../lib/shm.h" #include "../lib/sem.h" #include "../lib/sock.h" #include <stdio.h> #include <string.h> shm *cmd; shm *ret; void callback(int sock_id,int event,void * buf, int len, void * callbackdata) { switch(event){ case SOCK_CONNECT: break; case SOCK_DATAREADY: printf("bridge tcp receive: %s\n", buf); strcpy(cmd->addr, buf); printf("bridge shm send: %s\n",cmd->addr); v(cmd->semid); break; case SOCK_DISCONNECT: break; } } int main() { char sys_cmd[100];int sock_id; if(!(cmd = create_shm(10))||!((ret = create_shm(1024)))){ printf("create shm ERROR!\n"); return -1; }/*创建共享内存*/ sprintf(sys_cmd, "./client %d %d &\n", cmd->key,ret->key); system(sys_cmd);/*运行client程序*/ if(!(sock_id = connect_socket("127.0.0.1", 8888, callback, NULL))){ printf("connect error\n"); return -1;; }/*连接server*/ /*和client交互并把结果发回server*/ p(ret->semid); printf("bridge shm receive: %s\n", ret->addr); send_socket(sock_id, ret->addr, strlen(ret->addr)+1); printf("bridge tcp send: %s\n", ret->addr); del_shm(cmd); del_shm(ret); return 0; }client程序注解:#define SHM_DIR "./s" #include "../lib/shm.h" #include "../lib/sem.h" #include <stdio.h> int main(int argc,char *argv[]) { shm *cmd; shm *ret; int cmd_key, ret_key; cmd_key= atoi(argv[1]); ret_key= atoi(argv[2]); if(!(cmd = create_shm_t(cmd_key,10))||!((ret = create_shm_t(ret_key,1024)))){ printf("create shm ERROR!\n"); return -1; }/*连接到bridge创建的共享内存和信号量*/ /*和bridge完成一次交互*/ p(cmd->semid); printf("client shm receive: %s\n", cmd->addr); sprintf(ret->addr, "data_return"); printf("client shm send: %s\n", ret->addr); v(ret->semid); del_shm(cmd); del_shm(ret); return 0; }运行结果:
Related posts:
