| | |
| | | |
| | | ## 实例 |
| | | 请求应答 `./test2/server.c ./test2/client.c` |
| | | |
| | | ### 请求应答模式 |
| | | |
| | | `source ./demo/server.c` |
| | | |
| | | |
| | | |
| | | **运行server端:** |
| | | |
| | | `./req_req server 8` |
| | | |
| | | **运行client端:** |
| | | 可以打开多个client |
| | | |
| | | `./req_rep client 8` |
| | | |
| | | 在client端输入请求信息,server 端回应,client端输出回应信息 |
| | | |
| | | |
| | | ### 发布订阅模式 |
| | | |
| | | **运行server端:** |
| | | |
| | | `./pub_sub server 8` |
| | | |
| | | |
| | | **运行client端:** |
| | | 可以打开多个client |
| | | |
| | | `./pub_sub client 8` |
| | | |
| | | 在server端输入发布信息,client端输出收到的订阅信息 |
| | | |
| | | ## 接口说明 |
| | | ``` |
| | | |
| | | /** |
| | | * 创建socket |
| | | * @return socket地址 |
| | | */ |
| | | void *mod_open_socket(int mod); |
| | | |
| | | /** |
| | | * 关闭socket |
| | | */ |
| | | int mod_close_socket(void * _socket); |
| | | |
| | | /** |
| | | * 绑定端口到socket, 如果不绑定则系统自动分配一个 |
| | | * @return 0 成功, 其他值 失败的错误码 |
| | | */ |
| | | int mod_socket_bind(void * _socket, int port); |
| | | |
| | | |
| | | /** |
| | | * 服务端开启连接监听 |
| | | * @return 0 成功, 其他值 失败的错误码 |
| | | */ |
| | | int mod_listen(void * _socket); |
| | | |
| | | /** |
| | | * 客户端发起连接请求 |
| | | */ |
| | | int mod_connect(void * _socket, int port); |
| | | |
| | | /** |
| | | * 发送信息 |
| | | * @return 0 成功, 其他值 失败的错误码 |
| | | */ |
| | | int mod_send(void * _socket, const void *buf, const int size); |
| | | |
| | | /** |
| | | * 接收信息 |
| | | * @return 0 成功, 其他值 失败的错误码 |
| | | */ |
| | | int mod_recv(void * _socket, void **buf, int *size) ; |
| | | |
| | | /** |
| | | * 释放接收信息的buf |
| | | */ |
| | | void mod_free(void *buf); |
| | | |
| | | |
| | | /** |
| | | * 获取soket端口号 |
| | | */ |
| | | int mod_get_socket_port(void * _socket); |
| | | ``` |
| | | |
| | | |
New file |
| | |
| | | # |
| | | # Makefile for common library. |
| | | # |
| | | ROOT=.. |
| | | LDLIBS+=-Wl,-rpath=$(ROOT)/queue:$(ROOT)/lib |
| | | # 开源工具包路径 |
| | | LDDIR += -L$(ROOT)/queue |
| | | # 开源工具包 |
| | | LDLIBS += -lshm_queue -lusgcommon -lpthread |
| | | |
| | | INCLUDE += -I$(ROOT)/queue/ -I$(ROOT)/queue/include |
| | | |
| | | PLATFORM=$(shell $(ROOT)/systype.sh) |
| | | include $(ROOT)/Make.defines.$(PLATFORM) |
| | | |
| | | |
| | | PROGS = req_rep pub_sub |
| | | |
| | | |
| | | build: $(PROGS) |
| | | |
| | | # test1: $(LIBCOMMON) |
| | | |
| | | # 如果包A 引用包B, B 要放在 A 后面 |
| | | |
| | | clean: |
| | | rm -f $(TEMPFILES) $(PROGS) |
| | | |
| | | |
| | | |
| | | $(LIBQUEUE): |
| | | (cd $(ROOT)/queue && $(MAKE)) |
New file |
| | |
| | | #include "mod_socket.h" |
| | | #include "shm_mm.h" |
| | | #include "usg_common.h" |
| | | |
| | | |
| | | void server(int port) { |
| | | void *socket = mod_open_socket(PUB_SUB); |
| | | mod_socket_bind(socket, port); |
| | | mod_listen(socket); |
| | | int size; |
| | | void *recvbuf; |
| | | char sendbuf[512]; |
| | | while(true) { |
| | | printf("请输入发布消息:"); |
| | | scanf("%s", sendbuf); |
| | | mod_send(socket, sendbuf, strlen(sendbuf)+1) ; |
| | | free(recvbuf); |
| | | |
| | | } |
| | | mod_close_socket(socket); |
| | | } |
| | | |
| | | void client(int port) { |
| | | void *socket = mod_open_socket(PUB_SUB); |
| | | mod_connect(socket, port); |
| | | int size; |
| | | void *recvbuf; |
| | | |
| | | while(mod_recv(socket, &recvbuf, &size) == 0) { |
| | | printf("收到订阅消息: %s\n", (char *)recvbuf); |
| | | free(recvbuf); |
| | | |
| | | } |
| | | mod_close_socket(socket); |
| | | } |
| | | |
| | | int main(int argc, char *argv[]) { |
| | | shm_init(512); |
| | | int port; |
| | | if (argc < 3) { |
| | | fprintf(stderr, "Usage: reqrep %s|%s <PORT> ...\n", "server", "client"); |
| | | return 1; |
| | | } |
| | | |
| | | port = atoi(argv[2]); |
| | | |
| | | if (strcmp("server", argv[1]) == 0 ) { |
| | | server(port); |
| | | } |
| | | |
| | | if (strcmp("client", argv[1]) == 0) |
| | | client(port); |
| | | |
| | | shm_destroy(); |
| | | // fprintf(stderr, "Usage: reqrep %s|%s <URL> ...\n", "server", "client"); |
| | | return 0; |
| | | } |
New file |
| | |
| | | #include "mod_socket.h" |
| | | #include "shm_mm.h" |
| | | #include "usg_common.h" |
| | | |
| | | void server(int port) { |
| | | void *socket = mod_open_socket(REQ_REP); |
| | | mod_socket_bind(socket, port); |
| | | mod_listen(socket); |
| | | int size; |
| | | void *recvbuf; |
| | | char sendbuf[512]; |
| | | int rv; |
| | | while ( (rv = mod_recv(socket, &recvbuf, &size) ) == 0) { |
| | | sprintf(sendbuf, "SERVER RECEIVED: %s", recvbuf); |
| | | puts(sendbuf); |
| | | mod_send(socket, sendbuf, strlen(sendbuf) + 1); |
| | | free(recvbuf); |
| | | } |
| | | mod_close_socket(socket); |
| | | } |
| | | |
| | | void client(int port) { |
| | | void *socket = mod_open_socket(REQ_REP); |
| | | mod_connect(socket, port); |
| | | int size; |
| | | void *recvbuf; |
| | | char sendbuf[512]; |
| | | while (true) { |
| | | printf("request: "); |
| | | scanf("%s", sendbuf); |
| | | mod_send(socket, sendbuf, strlen(sendbuf) + 1); |
| | | mod_recv(socket, &recvbuf, &size); |
| | | printf("reply: %s\n", (char *)recvbuf); |
| | | free(recvbuf); |
| | | } |
| | | mod_close_socket(socket); |
| | | } |
| | | |
| | | |
| | | |
| | | int main(int argc, char *argv[]) { |
| | | shm_init(512); |
| | | int port; |
| | | if (argc < 3) { |
| | | fprintf(stderr, "Usage: reqrep %s|%s <PORT> ...\n", "server", "client"); |
| | | return 1; |
| | | } |
| | | |
| | | port = atoi(argv[2]); |
| | | |
| | | if (strcmp("server", argv[1]) == 0) { |
| | | server(port); |
| | | } |
| | | |
| | | if (strcmp("client", argv[1]) == 0) |
| | | client(port); |
| | | |
| | | |
| | | return 0; |
| | | } |
| | |
| | | |
| | | }; |
| | | |
| | | |
| | | /** |
| | | * 创建socket |
| | | * @return socket地址 |
| | | */ |
| | | void *mod_open_socket(int mod); |
| | | |
| | | /** |
| | | * 关闭socket |
| | | */ |
| | | int mod_close_socket(void * _socket); |
| | | |
| | | /** |
| | | * 绑定端口到socket, 如果不绑定则系统自动分配一个 |
| | | * @return 0 成功, 其他值 失败的错误码 |
| | | */ |
| | | int mod_socket_bind(void * _socket, int port); |
| | | |
| | | |
| | | /** |
| | | * 服务端开启连接监听 |
| | | * @return 0 成功, 其他值 失败的错误码 |
| | | */ |
| | | int mod_listen(void * _socket); |
| | | |
| | | |
| | | /** |
| | | * 客户端发起连接请求 |
| | | */ |
| | | int mod_connect(void * _socket, int port); |
| | | |
| | | /** |
| | | * 发送信息 |
| | | * @return 0 成功, 其他值 失败的错误码 |
| | | */ |
| | | int mod_send(void * _socket, const void *buf, const int size); |
| | | |
| | | /** |
| | | * 接收信息 |
| | | * @return 0 成功, 其他值 失败的错误码 |
| | | */ |
| | | int mod_recv(void * _socket, void **buf, int *size) ; |
| | | |
| | | /** |
| | | * 释放接收信息的buf |
| | | */ |
| | | void mod_free(void *buf); |
| | | |
| | | |
| | | /** |
| | | * 获取soket端口号 |
| | | */ |
| | | int mod_get_socket_port(void * _socket); |
| | | |
| | | #ifdef __cplusplus |
| | | } |
| | | #endif |
| | |
| | | extern "C" { |
| | | #endif |
| | | |
| | | /** |
| | | * 初始化共享内存 |
| | | * @size 共享内存大小, 单位M |
| | | * |
| | | */ |
| | | void shm_init(int size); |
| | | void shm_destroy() ; |
| | | |
| | | |
| | | |
| | | /** |
| | | * 销毁共享内存 |
| | | * 整个进程退出时需要执行这个方法,该方法首先会检查是否还有其他进程在使用该共享内存,如果还有其他进程在使用就只是detach,如果没有其他进程在使用则销毁整块内存。 |
| | | */ |
| | | void shm_destroy(); |
| | | |
| | | #ifdef __cplusplus |
| | | } |
| | |
| | | } shm_socket_t; |
| | | |
| | | |
| | | /** |
| | | * 初始化共享内存 |
| | | * @size 共享内存大小, 单位M |
| | | * |
| | | */ |
| | | void shm_init(int size); |
| | | |
| | | /** |
| | | * 销毁共享内存 |
| | | * 整个进程退出时需要执行这个方法,该方法首先会检查是否还有其他进程在使用该共享内存,如果还有其他进程在使用就只是detach,如果没有其他进程在使用则销毁整块内存。 |
| | | */ |
| | | void shm_destroy(); |
| | | |
| | | /** |
| | | * 释放recv方法分配的buf |
| | | */ |
| | | void shm_free(void *buf); |
| | | |
| | | shm_socket_t *shm_open_socket(); |
| | | |
| | |
| | | return rv; |
| | | } |
| | | |
| | | int mod_get_socket_port(void * _socket) { |
| | | mod_socket_t * socket = (mod_socket_t *) _socket; |
| | | return socket->shm_socket->port; |
| | | } |
| | | |
| | | |
| | | int mod_socket_bind(void * _socket, int port){ |
| | | mod_socket_t * socket = (mod_socket_t *) _socket; |