New file |
| | |
| | | # <center>BHomeBus ä½¿ç¨æå</center> |
| | | |
| | | |
| | | ## 1. BHomeBuså
å«çè§è² |
| | | - NetProxyServiceï¼ç½ç»ä»£çæå¡ï¼ï¼ è´è´£è·¨æºå¨è½¬ååå¸æè¯·æ±æ¶æ¯ |
| | | - BusServiceï¼ æ»çº¿æå¡ï¼: åå¸è®¢é
çè·¯ç±ï¼è´è´£è®°å½è®¢é
è
çæ¶æ¯å¹¶æåå¸è
åå¸çæ¶æ¯è½¬åç»æå
´è¶£ç订é
è
ã |
| | | - Pub/Sub Clientï¼åå¸è®¢é
客æ·ç«¯ï¼ï¼ åBusServiceå叿¶æ¯æè
å¨BusServiceä¸è®¢é
æå
´è¶£çæ¶æ¯ |
| | | - Request/Reply Client ï¼è¯·æ±åºç客æ·ç«¯ï¼ï¼åå
¶ä»æºå¨/è¿ç¨åéè¯·æ±æ¶æ¯æè
ä»å
¶ä»æºå¨/è¿ç¨æ¥ååºçæ¶æ¯ |
| | | |
| | | å
¶ä¸BusServiceåNetProxyServiceæ¯æå¡è¿ç¨ï¼ä½¿ç¨è
æå®èµ·æ¥åå°±ä¸éè¦å
³å¿äºã使ç¨è
主è¦å
³æ³¨çæ¯Pub/Sub Client å Request/Reply Client |
| | | |
| | | ## 2. 使ç¨è¯´æ |
| | | å
·ä½æ¯ä¸ªæ¹æ³çåå
¶åæ°ç说æå¯ä»¥åçå®ä»¬å¯¹åºç头æä»¶ã |
| | | |
| | | ä½¿ç¨æ¶ï¼æ¯å°ä¸»æºé½éè¦å
æBusServiceåNetProxyServiceè¿ä¸¤ä¸ªæå¡å¯å¨èµ·æ¥ãå 为åé¢çåè½é½ä¾èµè¿ä¸¤ä¸ªæå¡ã |
| | | |
| | | ### 2.1 å¯å¨NetProxyService |
| | | NetProxyServiceç头æä»¶æ¯ net_mod_server_socket_wrapper.h. ä¸é¢ç代ç å¯å¨ç«¯å£æ¯5000çç½ç»ä»£çæå¡ |
| | | |
| | | ``` |
| | | void *serverSocket = net_mod_server_socket_open(5000); |
| | | if(net_mod_server_socket_start(serverSocket) != 0) { |
| | | err_exit(errno, "net_mod_server_socket_start"); |
| | | } |
| | | ``` |
| | | |
| | | ### 2.2 å¯å¨BusService |
| | | BusServiceï¼ Pub/Sub Client å Request/Reply Clientç头æä»¶é½æ¯ net_mod_socket_wrapper.hï¼ ä¸é¢å¯å¨keyæ¯8çBusæå¡. |
| | | |
| | | ``` |
| | | |
| | | void * server_socket = net_mod_socket_open(); |
| | | |
| | | net_mod_socket_bind(server_socket, 8); |
| | | |
| | | net_mod_socket_start_bus(server_socket); |
| | | |
| | | ``` |
| | | |
| | | ### 2.3 Request/Reply ç¨ä¾è¯´æ |
| | | ç°å¨æ¨¡æä¸ä¸ªåºæ¯ï¼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 ç代ç å¦ä¸ï¼ |
| | | |
| | | ``` |
| | | int recv_arr_size, n; |
| | | net_mod_recv_msg_t *recv_arr; |
| | | const char* content = "HELLO WORLD!": |
| | | net_mod_socket_bind(client, 100); |
| | | net_node_t node_arr = { |
| | | {"192.168.20.102", 5000, 100}, |
| | | {"192.168.20.103", 5000, 100} |
| | | }; |
| | | 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); |
| | | printf(">>> %d nodes reply\n", n); |
| | | for(i=0; i<recv_arr_size; i++) { |
| | | printf("host:%s, port: %d, key:%d, content: %s\n", |
| | | recv_arr[i].host, |
| | | recv_arr[i].port, |
| | | recv_arr[i].key, |
| | | recv_arr[i].content |
| | | ); |
| | | } |
| | | |
| | | // 使ç¨å®åï¼ä¸è¦å¿è®°éæ¾æ |
| | | net_mod_socket_free_recv_msg_arr(recv_arr, recv_arr_size); |
| | | |
| | | ``` |
| | | |
| | | B å Cç代ç å¦ä¸ï¼ |
| | | |
| | | ``` |
| | | void *client = net_mod_socket_open(); |
| | | net_mod_socket_bind(client, 100); |
| | | int size; |
| | | void *recvbuf; |
| | | char sendbuf[512]; |
| | | int rv; |
| | | int remote_port; |
| | | while ( (rv = net_mod_socket_recvfrom(client, &recvbuf, &size, &remote_port) ) == 0) { |
| | | // printf( "server: RECEIVED REQUEST FROM PORT %d NAME %s\n", remote_port, recvbuf); |
| | | sprintf(sendbuf, "RECEIVED PORT %d NAME %s", remote_port, recvbuf); |
| | | net_mod_socket_sendto(client, sendbuf, strlen(sendbuf) + 1, remote_port); |
| | | free(recvbuf); |
| | | } |
| | | ``` |
| | | |
| | | |
| | | ### 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. |
| | | |
| | | 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; |
| | | |
| | | 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)); |
| | | } |
| | | ``` |
| | | |
| | | æ´å
·ä½çå®ä¾ä»£ç 请åç`test_net_mod_socket.c` |
| | | |
| | | ## 3 设计说æ |
| | | |
| | | 使ç¨çæ¶åï¼å¤§å®¶ä¼å¯¹BusServiceåNetProxyServiceè¿ä¸¤ä¸ªéè¦é¢å¤å¯å¨æå¡æå°çæãä¸é¢éç¹éè¿ä¸¤ä¸ªæå¡ååä¸äºè¯´æã |
| | | |
| | | ### 3.1 Bus设计 |
| | | |
| | | |
| | |  |
| | | |
| | | ä¸é¢è¿å¼ 示æå¾æ¯è¯´è®¢é
newsçClientæAåBï¼è®¢é
sportsçæBåCï¼è¿äºé½å¨æ»çº¿éè®°å½çãå½Aåæ»çº¿pubå主é¢sportsç¸å
³çå
容æ¶ï¼BåCä¼éè¿æ»çº¿æ¶å°è¿ä¸ªä¸»é¢çæ¶æ¯ã |
| | | |
| | | ### 3.2 NetProxyService设计 |
| | | |
| | | |
| | |  |
| | | |
| | | ä¸é¢è¿å¼ å¾è·¨æºå¨è¯·æ±åºçç示æå¾ãè¿å¼ 示æå¾æ¶è¯´å½èç¹Aåèç¹Bçkey 1001éååkey 1002éååéæ¶æ¯æ¶ï¼å®ä¼é¦å
åéå°èç¹Bçç½ç»ä»£çserverä¸ãç½ç»ä»£çserverä¼æè¯·æ±æ¶æ¯è½¬åå°ç¸åºçéåä¸ï¼å¹¶æ¥ååºçè¿åç»èç¹Aã |
| | | |
| | | åçè·¨æºå¨çåå¸è®¢é
乿¯éè¿è¿æ ·çæ¹å¼äº¤äºçã |
| | | |
| | | |
| | |
| | | /** |
| | | * å¦æå»ºç«è¿æ¥çèç¹æ²¡ææ¥åå°æ¶æ¯ä¼ä¸ç´çå¾
|
| | | * ånode_arr ä¸çææç½ç»èç¹åéè¯·æ±æ¶æ¯ï¼èç¹çè¿åä¿¡æ¯æ±æ»å¹¶åå¨å¨recv_arrä¸ |
| | | * @node_arr ç½ç»èç¹ç», @node_arr_len该æ°ç»é¿åº¦ |
| | | * @node_arr ç½ç»èç¹ç», @node_arr_len该æ°ç»é¿åº¦.妿IP为空å为æ¬å°åéã |
| | | * @send_buf åéçæ¶æ¯ï¼@send_size è¯¥æ¶æ¯ä½çé¿åº¦ |
| | | * @recv_arr è¿åçåºçæ¶æ¯ç»ï¼@recv_arr_size 该æ°ç»é¿åº¦ |
| | | * @return æååéçèç¹çä¸ªæ° |
| | |
| | | int net_mod_socket_recvfrom_timeout(void *_socket, void **buf, int *size, int *key, int sec, int nsec); |
| | | int net_mod_socket_recvfrom_nowait(void *_socket, void **buf, int *size, int *key); |
| | | |
| | | |
| | | /** |
| | | * å¦æå»ºç«è¿æ¥çèç¹æ²¡ææ¥åå°æ¶æ¯ä¼ä¸ç´çå¾
|
| | | * ånode_arr ä¸çææç½ç»èç¹åéè¯·æ±æ¶æ¯ï¼èç¹çè¿åä¿¡æ¯æ±æ»å¹¶åå¨å¨recv_arrä¸ |
| | | * @node_arr ç½ç»èç¹ç», @node_arr_len该æ°ç»é¿åº¦ |
| | | * @node_arr ç½ç»èç¹ç», @node_arr_len该æ°ç»é¿åº¦.妿IP为空å为æ¬å°åéã |
| | | * @send_buf åéçæ¶æ¯ï¼@send_size è¯¥æ¶æ¯ä½çé¿åº¦ |
| | | * @recv_arr è¿åçåºçæ¶æ¯ç»ï¼@recv_arr_size 该æ°ç»é¿åº¦ |
| | | * @return æååéçèç¹çä¸ªæ° |
| | | * ä¼ç¹ï¼1æä¸ªèç¹çæ
éä¸ä¼é»å¡å
¶ä»èç¹ã2æ§è½å¥½ |
| | | * ä¼ç¹ï¼1æä¸ªèç¹çæ
éä¸ä¼é»å¡å
¶ä»èç¹ã2 æ§è½å¥½ã 3 éç¨thread localææ¯å³ä¿è¯äºçº¿ç¨å®å
¨ï¼åå¯ä»¥ä½¿ç¨è¿æ¥æ± ç¼åè¿æ¥ |
| | | */ |
| | | int net_mod_socket_sendandrecv(void *_sockt, net_node_t *node_arr, int arrlen, void *send_buf, int send_size, |
| | | net_mod_recv_msg_t ** recv_arr, int *recv_arr_size) ; |
| | |
| | | ./test_net_mod_socket --fun="start_net_proxy" --port=5000 & server_pid=$! && echo "pid: ${server_pid}" |
| | | |
| | | # æå¼è¯·æ±åºçæµè¯çæ¥å端 |
| | | ./test_net_mod_socket --fun="start_reply" --key=11 & server_pid=$! && echo "pid: ${server_pid}" |
| | | ./test_net_mod_socket --fun="start_reply" --key=100 & server_pid=$! && echo "pid: ${server_pid}" |
| | | } |
| | | |
| | | function client() { |
| | |
| | | |
| | | |
| | | ./test_net_mod_socket --fun="start_net_client" \ |
| | | --sendlist="localhost:5000:11" \ |
| | | --sendlist="localhost:5000:100" \ |
| | | --publist="localhost:5000:8" |
| | | |
| | | |
| | |
| | | |
| | | function msend() { |
| | | ./test_net_mod_socket --fun="test_net_sendandrecv_threads" \ |
| | | --sendlist="localhost:5000:11, localhost:5000:11" |
| | | --sendlist="localhost:5000:100, localhost:5000:100" |
| | | |
| | | } |
| | | |
| | |
| | | |
| | | } |
| | | |
| | | |
| | | void start_bus_server(int key) { |
| | | printf("Start bus server\n"); |
| | | void * server_socket = net_mod_socket_open(); |
| | | |
| | | net_mod_socket_bind(server_socket, key); |
| | | |
| | | net_mod_socket_start_bus(server_socket); |
| | | } |
| | | |
| | | |
| | | |
| | | void start_reply(int key) { |
| | | printf("start reply\n"); |
| | | void *client = net_mod_socket_open(); |
| | | net_mod_socket_bind(client, key); |
| | | int size; |
| | | void *recvbuf; |
| | | char sendbuf[512]; |
| | | int rv; |
| | | int remote_port; |
| | | while ( (rv = net_mod_socket_recvfrom(client, &recvbuf, &size, &remote_port) ) == 0) { |
| | | // printf( "server: RECEIVED REQUEST FROM PORT %d NAME %s\n", remote_port, recvbuf); |
| | | sprintf(sendbuf, "RECEIVED PORT %d NAME %s", remote_port, recvbuf); |
| | | net_mod_socket_sendto(client, sendbuf, strlen(sendbuf) + 1, remote_port); |
| | | free(recvbuf); |
| | | } |
| | | } |
| | | |
| | | |
| | | void start_net_client(char *sendlist, char*publist ){ |
| | | client = net_mod_socket_open(); |
| | | char content[MAXLINE]; |
| | |
| | | |
| | | if (fgets(content, MAXLINE, stdin) != NULL) { |
| | | // æ¶å°æ¶æ¯çèç¹å³ä½¿æ²¡æå¯¹åºçä¿¡æ¯ï¼ ä¹è¦åå¤ä¸ä¸ªè¡¨ç¤ºæ çæ¶æ¯,å¦åä¼ä¸ç´çå¾
|
| | | n = net_mod_socket_sendandrecv(client, node_arr, node_arr_size, content, |
| | | strlen(content), &recv_arr, &recv_arr_size); |
| | | printf("send %d nodes\n", n); |
| | | 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", |
| | | recv_arr[i].host, |
| | |
| | | |
| | | } |
| | | |
| | | |
| | | void start_bus_server(int key) { |
| | | printf("Start bus server\n"); |
| | | void * server_socket = net_mod_socket_open(); |
| | | |
| | | net_mod_socket_bind(server_socket, key); |
| | | |
| | | net_mod_socket_start_bus(server_socket); |
| | | } |
| | | |
| | | |
| | | |
| | | void start_reply(int key) { |
| | | printf("start reply\n"); |
| | | void *socket = net_mod_socket_open(); |
| | | net_mod_socket_bind(socket, key); |
| | | int size; |
| | | void *recvbuf; |
| | | char sendbuf[512]; |
| | | int rv; |
| | | int remote_port; |
| | | while ( (rv = net_mod_socket_recvfrom(socket, &recvbuf, &size, &remote_port) ) == 0) { |
| | | // printf( "server: RECEIVED REQUEST FROM PORT %d NAME %s\n", remote_port, recvbuf); |
| | | sprintf(sendbuf, "RECEIVED PORT %d NAME %s", remote_port, recvbuf); |
| | | net_mod_socket_sendto(socket, sendbuf, strlen(sendbuf) + 1, remote_port); |
| | | free(recvbuf); |
| | | } |
| | | } |
| | | |
| | | |
| | | |