关于rabbitmq-c

SunyKing 2014-03-05 04:13:53
大家好。最近打算用rabbitmq来传输一些数据,按照demo来写,在一开始登录的地方就过不去了。
大致登录如下:
char const *hostname;
int port, status;
char const *exchange;
char const *bindingkey;
amqp_socket_t *socket = NULL;
amqp_connection_state_t conn;

amqp_bytes_t queuename;

//if (argc < 5) {
// fprintf(stderr, "Usage: amqp_listen host port exchange bindingkey\n");
// return 1;
//}

/*hostname = argv[1];
port = atoi(argv[2]);
exchange = argv[3];
bindingkey = argv[4];*/
hostname = "192.168.10.248";
port = 15672;
exchange = "amq.direct";
bindingkey = "test";

conn = amqp_new_connection();

socket = amqp_tcp_socket_new(conn);
if (!socket) {
die("creating TCP socket");
}

status = amqp_socket_open(socket, hostname, port);
if (status) {
die("opening TCP socket");
}

die_on_amqp_error(amqp_login(conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN, "guest", "guest"),
"Logging in");
amqp_channel_open(conn, 1);
die_on_amqp_error(amqp_get_rpc_reply(conn), "Opening channel");

后面的也不贴了,在amqp_login(conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN, "guest", "guest")卡住了,等几分钟后返回-7(Logging in: connection closed unexpectedly),跟踪代码在recv()里面卡住,可能一直等待接收服务器的数据,最后超时断开了连接。
rabbitmq版本是RabbitMQ 3.0.1, Erlang R15B03
管理页面打得开,C#也可以使用mq。不知道是配置的原因,还是我代码写的有问题,请各位帮忙看看。
...全文
759 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lianming37 2016-09-14
  • 打赏
  • 举报
回复
引用 5 楼 feiyu_lin 的回复:
第一个没有连接上是因为端口的问题,15672是管理端的端口,5672才是你要的端口。 第二个持久化的问题,持久化是在declare exchange和declare queue的时候确定的,在这declare的时候是是否持久化的参数。 另外,你的代码上没有declare自己的exchange,你publish的时候消息应该是发布到默认的exchange上了,默认的exchange的持久化怎么设置我也不清楚。
感谢解答我的问题!
老树新芽 2014-04-03
  • 打赏
  • 举报
回复
第一个没有连接上是因为端口的问题,15672是管理端的端口,5672才是你要的端口。 第二个持久化的问题,持久化是在declare exchange和declare queue的时候确定的,在这declare的时候是是否持久化的参数。 另外,你的代码上没有declare自己的exchange,你publish的时候消息应该是发布到默认的exchange上了,默认的exchange的持久化怎么设置我也不清楚。
SunyKing 2014-03-07
  • 打赏
  • 举报
回复
引用 3 楼 leekwen 的回复:
消息持久化应该是需要两个地方都修改! 1. exchange里打开持久化; 2. 发送端将delivery_mode = 2;
exchange里打开持久化,请问如何做呢?代码我在2楼给出,请帮忙看看。exchange我就是起了个名字而已。
SunyKing 2014-03-06
  • 打赏
  • 举报
回复
这个问题已经好了。因为端口告诉了我一个错误的。现在的问题是: amqp_basic_publish()这个函数,我发布倒都是成功,但是不知道怎么发布持久化的队列,我调用csdn的一个封装好的dll库(http://download.csdn.net/detail/chenfan_yy/5897385),发布上去后,用web打开管理页面,可以看到发布的队列。我不知道那是怎么做的,而且工程是2008的,那个dll是2010的,调用就报错(new,c运行库版本不兼容),所以那个dll暂时还不知道怎么用起来。请问如何使用rabbitmq-c发布呢?我目前是套的例子,不行的。 附代码:
bool MQProcessing:: Publish(const string& queuename,int channel,const string& msg)
{
    char const *hostname = m_strHostName.c_str();
    int  status;
    char const *exchange = m_strExchange.c_str();
    char const *routingkey = m_strRoutingkey.c_str();
    char const *messagebody = msg.c_str();
    amqp_socket_t *socket = NULL;
    amqp_connection_state_t conn;

    conn = amqp_new_connection();

    socket = amqp_tcp_socket_new(conn);
    if (!socket) {
        return die(_communicator,"creating TCP socket");
    }

    status = amqp_socket_open(socket, hostname, m_iPort);
    //const char* hh = amqp_error_string(status);
    if (status) {
        return die(_communicator,"opening TCP socket failed,socket closed");
    }
    //int sockfd;
    //die_on_error(_communicator,sockfd = amqp_open_socket(hostname, m_iPort), "Opening socket");
    //amqp_set_sockfd(conn, sockfd);

    if (    
        !die_on_amqp_error(_communicator,amqp_login(conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN, "guest", "guest"),
        "Logging in")
        )
    {
        return false;
    }


    amqp_channel_open(conn, channel);
    if (
        !die_on_amqp_error(_communicator,amqp_get_rpc_reply(conn), "Opening channel")
        )
    {
        return false;
    }
    {
        amqp_basic_properties_t props;
        props._flags = AMQP_BASIC_CONTENT_TYPE_FLAG | AMQP_BASIC_DELIVERY_MODE_FLAG;
        props.content_type = amqp_cstring_bytes("text/plain");
        props.delivery_mode = 2; /* persistent delivery mode */
        if (        
            !die_on_error(_communicator,amqp_basic_publish(conn,
            channel,
            amqp_cstring_bytes(exchange),
            amqp_cstring_bytes(routingkey),
            0,
            0,
            &props,
            amqp_cstring_bytes(messagebody)),
            "Publishing")
            )
        {
            return false;
        }

    }

    if (!die_on_amqp_error(_communicator,amqp_channel_close(conn, channel, AMQP_REPLY_SUCCESS), "Closing channel"))
    {
        return false;
    }
    if (!die_on_amqp_error(_communicator,amqp_connection_close(conn, AMQP_REPLY_SUCCESS), "Closing connection"))
    {
        return false;
    }
    if (!die_on_error(_communicator,amqp_destroy_connection(conn), "Ending connection"))
    {
        return false;
    }

    return true;
}
Leekwen 2014-03-06
  • 打赏
  • 举报
回复
检查你的管理页面,使用的账号是什么,是不是默认的登陆名和密码都为“guest”? 如果你的管理页面使用默认的“guest”都无法登陆,你的这个demo也是登陆不了的。 可能你是卡在了,Socket登陆时,用户名与密码校验的部分了。
Leekwen 2014-03-06
  • 打赏
  • 举报
回复
消息持久化应该是需要两个地方都修改! 1. exchange里打开持久化; 2. 发送端将delivery_mode = 2;

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧