当前位置: 首页 > 知识库问答 >
问题:

带有AWS EC2的ZeroMQ服务器/客户端

吕昀
2023-03-14

你好,我写了一个非常简单的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个答案

益智明
2023-03-14

尝试设置一个弹性IP地址,并将其绑定到路由53 dns名称,然后使用该名称。它应该解析为AWS网络上机器的专用IP地址。单独使用私有IP或私有dns名称将永远不会保证保持不变。

高经艺
2023-03-14

好吧,所以感谢一个朋友帮助我弄清楚发生了什么,这是答案:

基本上,该应用程序在Windows Server 2012实例上运行,并且Windows防火墙阻止了任何指向我的应用程序的流量。将应用程序添加到Windows防火墙的允许应用程序列表中可以解决问题。

所以这里有一个关于如何使它工作的回顾

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

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

端口5556上的自定义TCP Aywhere

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

 类似资料:
  • 我有一个来自http工具包的Websocket连接(Clojure,它工作得很好)。我从客户端发送ping以确保我们仍然保持连接,并且在那里一切正常。我的问题是,在这种情况下,人们是否会从服务器ping客户端? 我试图设置一些东西,如果我没有得到响应,就从服务器上删除频道,但是设置定时进程和改变状态来跟踪乒乓周期不是很方便,所以它变得有点难看。然后我就想,服务器能处理几十万个同时连接,我是不是就应

  • 我有一个带sokjs套接字的节点应用程序。 一些HTML/JS客户端使用stomp over sock JS,但我不明白订阅是如何工作的: 客户端已连接,事件已记录,但范围为$scope。从不打电话通知。如何配置主题订阅? 编辑: 请注意,我一定清楚。 我使用sockjs模块作为websocket服务器。 没有太多的配置:

  • 是否可以使用ActiveMQ Artemis客户机库(1.5.x或2.x)连接到HornetQ服务器?

  • 问题内容: 我在Node.js中有一个使用Expressjs和Handlebars作为模板引擎的应用程序。 Expressjs使用布局,然后呈现视图。布局(layout.hbs)如下所示: 在当您访问路径被替换服务器端的node.js内。例如: 将标记替换为index.hbs的内容。 现在,在客户端上,我正在使用Backbone.js,并希望对通过Backbone控制的视图使用Handlebars

  • C Async描述了如何创建一个异步服务器和一个相应的异步客户机来与之通信。我已经在微软ViualStudio中创建了这个。 我现在需要一个java客户端说话的C服务器-我无法找到一个Java等效的客户端(到C)与C通信。 任何指点都将不胜感激

  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se