1. 程式人生 > >使用nanomsg庫實現多執行緒之間的通訊(三)

使用nanomsg庫實現多執行緒之間的通訊(三)

概述:

   這次使用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
...

通過結果可以看到主執行緒可以傳送資料到子執行緒,子執行緒也可以傳送資料到主執行緒。