首页 文章

使用AWS EC2的ZeroMQ服务器/客户端

提问于
浏览
2

您好我写了一个非常简单的ZMQ服务器和客户端应用程序 . 它在我的本地计算机上工作正常,如果我从AWS(同一安全组)中运行这两个应用程序,它也可以正常工作 . 我尝试在AWS安全组中打开正确的端口(入站和出站) . 我甚至将它们打开到任何端口/地址上的所有流量 . 但我没有收到客户发布的消息 .

我的客户端代码如下所示

#include <string>
#include <iostream>
#include "zmq.hpp"

static std::string s_recv (zmq::socket_t &socket) 
{
    zmq::message_t message;
    socket.recv(&message);
    return std::string(static_cast<char*>(message.data()), message.size()-1);
}

int main (int argc, char* argv[])
{
     std::string adrStr = argv[1];
     zmq::context_t context (1);
     zmq::socket_t subscriber (context, ZMQ_SUB);

     std::cout << "Connecting to server..." << std::endl;
     subscriber.connect(adrStr.c_str());
     const char *filter ="Sending ";

     subscriber.setsockopt(ZMQ_SUBSCRIBE, filter ,strlen(filter));

     int update_nbr=0;
     for (update_nbr=0; update_nbr<100; update_nbr++)
     {
          zmq::message_t update;
          std::string msg_s=s_recv(subscriber);
          std::cout<<"Received something..."<<msg_s<<std::endl;
     }

     return 0;
}

我的服务器端代码看起来像这样

#include <string>
#include <iostream>
#include "zmq.hpp"

int main () 
{
    //  Prepare our context and socket
    zmq::context_t context (1);
    zmq::socket_t publisher (context, ZMQ_PUB);

    std::cout << "Binding to port ..." << std::endl;

    publisher.bind("tcp://*:5556");

    int cnt =0;
    while(1)
    {
         char buffer[30];
         int msgn=0;
         msn = sprint_s(buffer, "Sending number %d", cnt);
         std::cout<<buffer<<std::endl;
         zmq::message_t message(30);
         memcpy((void*) message.data(), buffer,30);

         publisher.send(message);

         Sleep(1);
         cnt++;
     }

     return 0;
 }

在客户端应用程序命令行中,我尝试传入正确格式为“TCP:// public-dns:5556”的公共DNS我也尝试使用公共TCP / IP

谁知道我可能会失踪什么?

2 回答

  • 0

    尝试设置弹性IP地址并将其绑定到53 dns名称并使用该地址 . 它应解析为AWS网络上的计算机的专用IP地址 . 单独使用私有IP或私有DNS名称永远不会保证保持不变 .

  • 0

    好的,所以感谢一位帮我弄清楚这里发生了什么的朋友的答案:

    基本上应用程序在Windows Server 2012实例上运行,Windows防火墙阻止了我的应用程序的任何流量 . 将应用程序添加到Windows防火墙的允许应用程序列表中就可以了 .

    所以这里是回顾一下如何使其发挥作用

    我的服务器应用现在绑定到tcp:// *:5556,我的客户端连接到tcp:// public-ip:5556

    通过EC2控制台管理,添加安全组规则

    端口5556上的自定义TCP Aywhere

    在服务器上确保将服务器可执行文件添加到允许的应用程序列表中 .

相关问题