python 发布
import zmq
from random import randrange
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5556")#这里一般不改
while True:
zipcode =1
temperature = 2
relhumidity =2
socket.send_string(f"{zipcode} {temperature} {relhumidity}")#传输三个信息
c++接收
#include#include #include int main (int argc, char *argv[]) { zmq::context_t context ; // Socket to talk to server std::cout << "Collecting updates from weather server...n" << std::endl; zmq::socket_t subscriber (context, zmq::socket_type::sub); subscriber.connect("tcp://localhost:5556");//改成你要订阅的ip地址,将localhost换成ip地址,后面的:5556是端口号,得和前面的程序对接上.即不用改. // Subscribe to zipcode, default is NYC, 10001 const char *filter = (argc > 1)? argv [1]: "10001 "; subscriber.setsockopt(ZMQ_SUBSCRIBE, "", 0);//把后面两个参数改成这样,什么都能接收到, for(int i =0;i<2;i++) { zmq::message_t update; int one_x, one_y, two_x,two_y,three_x,three_y,four_x,four_y; subscriber.recv(&update); std::istringstream iss(static_cast (update.data())); iss >> one_x >> one_y >> two_x>>two_y >>three_x>>three_y >>four_x >>four_y ; printf("%d 和%d 和 %d和 %d 和%d 和%d和 %d 和%d",one_x,one_y,two_x,two_y,three_x,three_y,four_x,four_y); }//这里由于python只传输三个数据,所以只有前三个有数据. return 0; }
效果如图:
循环两次打印的哈哈.
下面是自己的笔记,读者可以忽略不看
#include#include #include #include struct ConmInfo { int car_one_x; int car_one_y; int car_two_x; int car_two_y; int car_three_x; int car_three_y; int car_four_x; int car_four_y; }; #define within(num) (int) ((float) num * random () / (RAND_MAX + 1.0)) int main () { // Prepare our context and publisher zmq::context_t context ; zmq::socket_t publisher (context, ZMQ_PUB);//zmq::socket_type::pub ConmInfo chong ; publisher.bind("tcp://*:5556"); // Initialize random number generator // srandom ((unsigned) time (NULL)); while (1) { // Get values that will fool the boss chong=ConmInfo{1,2,3,4,5,6,7,8}; // Send message to all subscribers zmq::message_t send_message(sizeof(ConmInfo));//sizeof要的 memcpy(send_message.data(),&chong,sizeof(chong)); // zmq::message_t message(20); // snprintf ((char *) message.data(), 20 , // "%d %d %d %d %d %d %d %d", car_one_x, car_two_x=3, car_three_x=5); // printf("%d",chong.car_one_x); publisher.send(send_message); } return 0; }
#include#include #include struct ConmInfo { int car_one_x; int car_one_y; int car_two_x; int car_two_y; int car_three_x; int car_three_y; int car_four_x; int car_four_y; }; int main (int argc, char *argv[]) { zmq::context_t context ; ConmInfo chong=ConmInfo{}; // Socket to talk to server std::cout << "Collecting updates from weather server...n" << std::endl; zmq::socket_t subscriber (context, zmq::socket_type::sub); subscriber.connect("tcp://10.11.31.56:5556"); // Subscribe to zipcode, default is NYC, 10001 const char *filter = (argc > 1)? argv [1]: "10001 "; subscriber.setsockopt(ZMQ_SUBSCRIBE, "", 0);//玄机在这里,这里是什么都接,具体用法还得看看后面怎么用 // Process 100 updates int update_nbr; long total_temp = 0; while(true) { zmq::message_t recv_message(sizeof(ConmInfo)); subscriber.recv(&recv_message); memcpy(&chong,recv_message.data(),sizeof(chong)); // std::istringstream iss(static_cast (update.data())); // iss >> zipcode >> temperature >> relhumidity ; printf("%d 和 %d 和%d ",chong.car_two_x,chong.car_one_y,chong.car_one_x); } return 0; }



