wangzhengquan
2021-01-15 b750d359d742349be27463a5408f352aa042fdec
doc/ʹÓÃÖ¸ÄÏ.mk
@@ -3,7 +3,7 @@
    
## 1. BHomeBus包含的角色
- NetProxyService(网络代理服务): è´Ÿè´£è·¨æœºå™¨è½¬å‘发布或请求消息
- BusService( æ€»çº¿æœåŠ¡ï¼‰: å‘布订阅的路由,负责记录订阅者的消息并把发布者发布的消息转发给感兴趣的订阅者。
- BusService(总线服务): å‘布订阅的路由,负责记录订阅者的消息并把发布者发布的消息转发给感兴趣的订阅者。
- Pub/Sub Client(发布订阅客户端): å‘BusService发布消息或者在BusService上订阅感兴趣的消息
- Request/Reply Client ï¼ˆè¯·æ±‚应答客户端):向其他机器/进程发送请求消息或者从其他机器/进程接受应答消息
@@ -25,19 +25,21 @@
```
### 2.2 å¯åЍBusService
BusService, Pub/Sub Client å’Œ Request/Reply Client的头文件都是 net_mod_socket_wrapper.h, ä¸‹é¢å¯åЍkey是8的Bus服务.
BusService的头文件是bus_server_socket_wrapper.h, ä¸‹é¢æ˜¯å¯åЍBus服务的代码.
```
void * server_socket = net_mod_socket_open();
net_mod_socket_bind(server_socket, 8);
net_mod_socket_start_bus(server_socket);
void * server_socket = bus_server_socket_wrapper_open();
if(bus_server_socket_wrapper_start_bus(server_socket) != 0) {
    printf("start bus failed\n");
    exit(1);
}
```
###  2.3 Request/Reply ç”¨ä¾‹è¯´æ˜Ž
Pub/Sub Client å’Œ Request/Reply Client的头文件都是 net_mod_socket_wrapper.h
现在模拟一个场景,A向B和C发送一个请求,B和C收到请求后分别返回一个响应给A ã€‚假设A的IP是192.168.20.101,B的IP是192.168.20.102, C的IP是192.168.20.103, å®ƒä»¬çš„key都是100, ä»£ç†server的端口是5000。
A çš„代码如下:
@@ -54,7 +56,9 @@
int node_arr_size = 2;
void *client = net_mod_socket_open();
n = net_mod_socket_sendandrecv(client, node_arr, node_arr_size, content, strlen(content), &recv_arr, &recv_arr_size);
n = net_mod_socket_sendandrecv(client, node_arr, node_arr_size,
   content, strlen(content), &recv_arr, &recv_arr_size);
printf(">>> %d nodes reply\n", n);
for(i=0; i<recv_arr_size; i++) {
    printf("host:%s, port: %d, key:%d, content: %s\n", 
@@ -91,37 +95,62 @@
### 2.3 Pub/Sub ç”¨ä¾‹è¯´æ˜Ž
现在模拟一个场景,B å’Œ C订阅了主题news, A å‘布了该主题相关的内容 ã€‚假设A的IP是192.168.20.101,B的IP是192.168.20.102, C的IP是192.168.20.103, å®ƒä»¬çš„key都是200, Bus的key是8, ä»£ç†server的端口是5000.
现在模拟一个场景,B å’Œ C订阅了主题news, A å‘布了该主题相关的内容 ã€‚假设A的IP是192.168.20.101,B的IP是192.168.20.102, C的IP是192.168.20.103, å®ƒä»¬çš„key都是200,  ä»£ç†server的端口是5000.
A的代码如下:
```
int n;
const char* topic = "news":
const char* content = "HELLO WORLD!":
void *client = net_mod_socket_open();
net_mod_socket_bind(client, 200);
net_node_t node_arr = {
   {"192.168.20.102", 5000, 8},
    {"192.168.20.103", 5000, 8}
};
int node_arr_size = 2;
int main() {
   int n;
    const char* topic = "news":
    const char* content = "HELLO WORLD!":
    void *client = net_mod_socket_open();
    net_mod_socket_bind(client, 200);
    net_node_t node_arr = {
        {"192.168.20.102", 5000},
        {"192.168.20.103", 5000}
    };
    int node_arr_size = 2;
void *client = net_mod_socket_open();
net_mod_socket_bind(client, 200);
n = net_mod_socket_pub(client, pub_node_arr, pub_node_arr_size, topic, strlen(topic)+1, content, strlen(content)+1);
printf("pub %d nodes\n", n);
    void *client = net_mod_socket_open();
    net_mod_socket_bind(client, 200);
    n = net_mod_socket_pub(client, pub_node_arr,
       pub_node_arr_size, topic, strlen(topic)+1, content, strlen(content)+1);
    printf("pub %d nodes\n", n);
}
```
B å’Œ C çš„代码如下
```
const char* topic = "news":
void *client = net_mod_socket_open();
net_mod_socket_bind(client, 200);
while (net_mod_socket_sub(client, topic, strlen(topic),  8) == 0) {
 printf("%d Sub success!\n", net_mod_socket_get_key(client));
// æ‰“印接受到的订阅消息
void *print_sub_msg(void *sockt) {
  pthread_detach(pthread_self());
  void *recvbuf;
  int size;
  int key;
  while (net_mod_socket_recvfrom( sockt, &recvbuf, &size, &key) == 0) {
    printf("收到订阅消息:%s\n", recvbuf);
    free(recvbuf);
  }
}
int main() {
    pthread_t tid;
    // åˆ›å»ºä¸€ä¸ªçº¿ç¨‹æŽ¥å—订阅消息
    pthread_create(&tid, NULL, print_sub_msg, client);
    const char* topic = "news":
    void *client = net_mod_socket_open();
    net_mod_socket_bind(client, 200);
    // è®¢é˜…感兴趣的主题
    if (net_mod_socket_sub(client, topic, strlen(topic)) == 0) {
     printf("%d Sub success!\n", net_mod_socket_get_key(client));
    }
}
```
更具体的实例代码请参看`test_net_mod_socket.c`