wangzhengquan
2020-07-27 2e1afff475181677a3dd38ab6e6d5632f8a70590
README.md
@@ -1,92 +1,204 @@
 
## 实例
# 1. 实例
 ### 请求应答模式
 `source ./demo/server.c`
## 1.1 Bus模式
Source
`dgram_mod_bus.c`
编译
安装好so包后,用如下的方式编译,shm_queue是通信队列包,usgcommon是公共包,pthread是系统的线程包
`g++ dgram_mod_bus.c -mcx16 -std=c++11 -lshm_queue -lusgcommon -lpthread`
演示
启动bus `./dgram_mod_bus server 8`。然后打开两个客户端连接bus, 第一个客户端订阅 "news", 第二个客户端发布 "news". 第一个客户端会收到第二个客户端推送的信息。
启动bus
```
$  ./dgram_mod_bus server 8
```
第一个客户端订阅 "news"
```
$ ./dgram_mod_bus client 8
Can I help you? sub, pub or quit
sub
Please input topic!
news
Sub success!
Can I help you? sub, pub or quit
收到订阅消息:111111111111111111111
 ```
第二个客户端发布 "news"
 ```
$  ./dgram_mod_bus client 8
Can I help you? sub, pub or quit
pub
Please input topic and content
news 111111111111111111111
Pub success!
Can I help you? sub, pub or quit
 ```
这里可以打开许多个客户端发布和订阅消息。
 
## 1.2 req_rep模式, 适应于注册
 
 **运行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端输出收到的订阅信息
Source `dgram_mod_req_rep.c`
## 接口说明
编译 同上
演示
```
## 启动注册中心
./dgram_mod_req_rep server 2 & node0=$! && sleep 1
## 向注册中心发送消息
./dgram_mod_req_rep client 2 node1
kill $node0
```
## survey模式, 适应于心跳
Source `dgram_mod_survey.c`
编译 同上
启动心跳中心
```
$ ./dgram_mod_survey server 3
RECEIVED HREARTBEAT FROM 1000: 0
RECEIVED HREARTBEAT FROM 1000: 1
RECEIVED HREARTBEAT FROM 1000: 2
RECEIVED HREARTBEAT FROM 1000: 3
RECEIVED HREARTBEAT FROM 1000: 4
RECEIVED HREARTBEAT FROM 1000: 5
RECEIVED HREARTBEAT FROM 1000: 6
RECEIVED HREARTBEAT FROM 1000: 7
RECEIVED HREARTBEAT FROM 1000: 8
RECEIVED HREARTBEAT FROM 1000: 9
```
打开一个客户端,连接心跳中心
```
$ ./dgram_mod_survey client 3
SEND HEART:0
SEND HEART:1
SEND HEART:2
SEND HEART:3
SEND HEART:4
SEND HEART:5
SEND HEART:6
SEND HEART:7
SEND HEART:8
SEND HEART:9
```
# 2. 接口说明
shm_mm.h
```
/**
 * 初始化共享内存
 * @size 共享内存大小, 单位M
 *
 */
void shm_init(int size);
/**
 * 销毁共享内存
 * 整个进程退出时需要执行这个方法,该方法首先会检查是否还有其他进程在使用该共享内存,如果还有其他进程在使用就只是detach,如果没有其他进程在使用则销毁整块内存。
 */
void shm_destroy();
```
dgram_mod_socket.h
```
/**
 * 创建socket
 * @return socket地址
*/
void *mod_open_socket(int mod);
void *dgram_mod_open_socket();
/**
 * 关闭socket
 * @return 0 成功, 其他值 失败的错误码
*/
int mod_close_socket(void * _socket);
int dgram_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);
int dgram_mod_bind(void * _socket, int port);
/**
 * 发送信息
 * @port 发送给谁
 * @return 0 成功, 其他值 失败的错误码
 */
int mod_send(void * _socket, const void *buf, const int size);
int dgram_mod_sendto(void *_socket, const void *buf, const int size, const int port);
/**
 * 接收信息
 * @port 从谁哪里收到的信息
 * @return 0 成功, 其他值 失败的错误码
*/
int mod_recv(void * _socket, void **buf, int *size) ;
int dgram_mod_recvfrom(void *_socket, void **buf, int *size, int *port);
/**
 * 释放接收信息的buf
 * 发送请求信息并等待接收应答
 * @port 发送给谁
 * @return 0 成功, 其他值 失败的错误码
*/
int dgram_mod_sendandrecv(void * _socket, const void *send_buf, const int send_size, const int port, void **recv_buf, int *recv_size) ;
/**
 * 启动bus
 *
 * @return 0 成功, 其他值 失败的错误码
*/
int  dgram_mod_start_bus(void * _socket);
/**
 * 订阅指定主题
 * @topic 主题
 * @size 主题长度
 * @port 总线端口
 */
void mod_free(void *buf);
int  dgram_mod_sub(void * _socket, void *topic, int size, int port);
/**
 * 发布主题
 * @topic 主题
 * @content 主题内容
 * @port 总线端口
 */
int  dgram_mod_pub(void * _socket, void *topic, int topic_size, void *content, int content_size, int port);
/**
 * 获取soket端口号
 */
int mod_get_socket_port(void * _socket);
int dgram_mod_get_port(void * _socket) ;
/**
 * 释放存储接收信息的buf
 */
void dgram_mod_free(void *buf) ;
```