使用nanomsg庫實現多執行緒之間的通訊(三)
阿新 • • 發佈:2018-12-18
概述:
這次使用nanomsg庫實現多執行緒一對多的雙向通訊,其實類似一個伺服器,其他均為客戶端,且它們之間是長連線,所以伺服器可以主動和客戶端通訊,客戶端也可以和伺服器通訊,這樣的一個方式。
多執行緒一對多雙向通訊Demo
#include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <nanomsg/survey.h> #include <nanomsg/nn.h> /* 此程式為nanomsg多執行緒一對多雙向通訊demo,伺服器可以傳送訊息,所 有客戶端都可接收並回應資料。 */ //inproc 標識用於多執行緒通訊 char *url = "inproc://sky_test"; //伺服器socket初始化 int server_sock_init(int *sock) { *sock = nn_socket (AF_SP, NN_SURVEYOR); if (*sock < 0) { printf("create server data sock failed\r\n"); return 1; } if (nn_bind(*sock, url) < 0) { printf("bind server data sock failed\r\n"); return 1; } printf("server data socket init success...\r\n"); return 0; } //客戶端socket初始化 int client_sock_init(int *sock) { *sock = nn_socket (AF_SP, NN_RESPONDENT); if (*sock < 0) { printf("create client data sock failed\r\n"); return 1; } if (nn_connect(*sock, url) < 0) { printf("connect client data sock failed\r\n"); return 1; } printf("client data socket init success...\r\n"); return 0; } //執行緒1測試 void *thread_test(void *arg) { int c_sock; if (0 != client_sock_init(&c_sock)) { return; } while (1) { char *txmsg = "Hi Main Pro, I`m Thread 1"; char *rx_msg = NULL; int result = nn_recv(c_sock, &rx_msg, NN_MSG, NN_DONTWAIT); if (result > 0) { printf("Thread 1 Recieve: %s\r\n\r\n", rx_msg); nn_freemsg (rx_msg); //迴應資料 nn_send(c_sock, txmsg, strlen(txmsg)+1, 0); } sleep(1); } } //執行緒2測試 void *thread_test2(void *arg) { int c_sock; if (0 != client_sock_init(&c_sock)) { return; } while (1) { char *rx_msg = NULL; char *txmsg = "Hi Main Pro, I`m Thread 2"; int result = nn_recv(c_sock, &rx_msg, NN_MSG, NN_DONTWAIT); if (result > 0) { printf("Thread 2 Recieve: %s\r\n\r\n", rx_msg); nn_freemsg (rx_msg); //迴應資料 nn_send(c_sock, txmsg, strlen(txmsg)+1, 0); } sleep(1); } } //傳送資料 int send_data(int sock, char *data) { if (data == NULL) { return 1; } if (nn_send(sock, data, strlen(data)+1, 0) < 0) { return 1; } printf("Main Server Send:%s\r\n\r\n", data); return 0; } int main() { int s_sock, ret, i = 0; pthread_t ps, ps2; char *tx_msg = "Hello Every Thread"; if (0 != server_sock_init(&s_sock)) { return 1; } //建立子執行緒,接收資訊 pthread_create(&ps, NULL, thread_test, NULL); pthread_create(&ps2, NULL, thread_test2, NULL); sleep(1); while (1) { //傳送資訊 ret = send_data(s_sock, tx_msg); sleep(1); while (1) { //接收客戶端資訊 char *rx_msg = NULL; int result = nn_recv(s_sock, &rx_msg, NN_MSG, NN_DONTWAIT); if (result > 0) { printf("Main Recieve: %s\r\n\r\n", rx_msg); nn_freemsg (rx_msg); } } } return 0; }
編譯
gcc -o nanomsg_survey nanomsg_survey.c -lnanomsg -lpthread
執行結果: [email protected]:~/Study/nanomsg/code_test/inproc/survey$ ./nanomsg_survey server data socket init success... client data socket init success... client data socket init success... Main Server Send:Hello Every Thread Thread 2 Recieve: Hello Every Thread Thread 1 Recieve: Hello Every Thread Main Recieve: Hi Main Pro, I`m Thread 2 Main Recieve: Hi Main Pro, I`m Thread 1 ... 通過結果可以看到主執行緒可以傳送資料到子執行緒,子執行緒也可以傳送資料到主執行緒。