/***************************************************************************** * Copyright: 2016-2026, Ieucd Tech. Co., Ltd. * File name: server.c * Description: 用于实现zmq多线程收发结构体消息的通信框架。 * Author: TLSong * Version: V0.0.1 * Date: 2020/7/7 * History: * 2020/7/7 创建文件。 * *****************************************************************************/ #include #include #include #include #include #include #include #include #include "data_mode.h" void *value_server(void *args) { Msg max_msg = {INT_MAX, CHAR_MAX, SHRT_MAX, LONG_MAX, FLT_MAX, DBL_MAX, "Hello Max Value!"}; Msg min_msg = {INT_MIN, CHAR_MIN, SHRT_MIN, LONG_MIN, FLT_MIN, DBL_MIN, "Hello Min Value!"}; Msg random_msg = {233, 'h', 244, 255, 0.01, 0.0001, "Hello Random Value!"}; // Socket to talk to clients void *context = zmq_ctx_new (); void *responder = zmq_socket (context, ZMQ_REP); int rc = zmq_bind (responder, "tcp://*:5555"); assert (rc == 0); while (1) { char buffer [10]; zmq_recv (responder, buffer, 10, 0); printf ("Received: %s\n",buffer); sleep (1); // Do some 'work' Msg send_msg; if(strcmp(buffer,"MAX")==0) send_msg = max_msg; else if(strcmp(buffer,"MIN")==0) send_msg = min_msg; else send_msg = random_msg; zmq_send (responder, &send_msg, sizeof(send_msg), 0); printf ("Sned message: \n"); printf ("---------------start---------------\n"); printf ("int: %d\n",send_msg.Int); printf ("char: %c\n",send_msg.Char); printf ("short: %hd\n",send_msg.Short); printf ("long: %ld\n",send_msg.Long); printf ("float: %d\n",send_msg.Float); printf ("double: %d\n",send_msg.Double); printf ("String: %s\n",send_msg.String); printf ("--------------- end ---------------\n"); } } void *sub_weather(void *args) { void* context = zmq_ctx_new(); assert(context != NULL); void* subscriber = zmq_socket(context, ZMQ_SUB); assert(subscriber != NULL); int ret = zmq_connect(subscriber, "tcp://localhost:5556"); assert(ret == 0); ret = zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "", 0); assert(ret == 0); while(1) { printf("into while\n"); char szBuf[1024] = {0}; ret = zmq_recv(subscriber, szBuf, sizeof(szBuf) - 1, 0); if (ret > 0) { printf("%s\n", szBuf); } } zmq_close(subscriber); zmq_ctx_destroy(context); } int main (void) { int value_ret, sub_weather_ret; pthread_t value_pth, sub_weather_pth; //线程ID变量 // 参数:创建的线程ID,线程参数,调用函数,函数参数 value_ret = pthread_create(&value_pth,NULL,value_server,NULL); sub_weather_ret = pthread_create(&sub_weather_pth,NULL,sub_weather,NULL); pthread_join(value_pth,NULL); // 等待线程结束 //pthread_join(sub_weather_pth.NULL); return 0; }