使用xmpp库loudmouth连接google talk服务器

google talk的通信协议采用的是xmpp,xmpp是开放协议。gmail邮箱中的聊天功能就是基于这个协议实现的吧。xmpp客户端协议都多种语言实现包括 javascript,c,c++,c#,python等。
loudmouth是xmpp客户端协议的轻量级易于使用的c语言实现。目前正在发展中,虽然功能还不丰富,但基本的功能都已具备。

1)下载并编译loudmouth

wget ftp://ftp.gnome.org/pub/GNOME/sources/loudmouth/1.4/loudmouth-1.4.3.tar.bz2
下载目前(2011-02-20)的最新版。加压后执行著名的“./configure ; make ; make install”三部曲即可。但有些事情需要注意

    a)loudmouth依赖glib库(gnome平台的c基础库)。使用

pkg-config --cflags --libs glib-2.0
         我这儿的输出是 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include  -lglib-2.0 
    b)连接google talk 服务器需要ssl支持,loudmouth支持gnutls和openssl,我使用的是openssl。在configure的时候要把ssl的支持打开,for example
./configure --prefix=/usr/local --with-ssl=openssl CFLAGS=“-g -O0”
加上-g -O0便于调试

2)查看安装结果

       根据上面的配置,我安装到了 /usr/local 下。所以执行
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
       然后执行 pkg-config   --cflags --libs loudmouth-1.0应该有如下输出:
-I/usr/local/include/loudmouth-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include  -L/usr/local/lib -lloudmouth-1 -lglib-2.0

3)连接google talk

首先要有一个xmpp的帐号,对于google talk的xmpp实现来说就是一个gmail帐号,xxxx@gmail.com 之类的。
废话不多说了贴代码吧。
#include <loudmouth/loudmouth.h>
#include <stdio.h>

static LmHandlerResult lm_message_handle (LmMessageHandler *handler,
                                   LmConnection *conn, LmMessage *msg, gpointer data);

int
main (int argc, char **argv) 
{
        LmConnection *conn;
        GError *error = NULL;
        LmMessage *m;
        LmSSL *ssl;
        LmMessageHandler *msghandler;
 
        if (argc < 6) {
                g_print ("Usage: test server username password recipient message");
                return -1;
        }
 
        conn = lm_connection_new (argv[1]);

        ssl = lm_ssl_new (NULL, NULL, NULL, NULL);
        lm_ssl_use_starttls (ssl, TRUE, TRUE);
        lm_connection_set_ssl (conn, ssl);
 
        if (!lm_connection_open_and_block (conn, &error)) {
                g_print ("Couldn't open connection to '%s':\n%s\n", 
                         argv[1], error->message);
                return -1;
        }
 
        if (!lm_connection_authenticate_and_block (conn, argv[2], argv[3],
                                                   "MyTestApp", &error)) {
                g_print ("Couldn't authenticate with '%s' '%s':\n%s\n", 
                         argv[2], argv[3], error->message);
                return -1;
        }

        msghandler = lm_message_handler_new (lm_message_handle, NULL, NULL);
         lm_connection_register_message_handler (conn, msghandler, LM_MESSAGE_TYPE_MESSAGE,
         LM_HANDLER_PRIORITY_LAST);

        m = lm_message_new (argv[4], LM_MESSAGE_TYPE_MESSAGE);
        lm_message_node_add_child (m->node, "body", argv[5]);
 
        if (!lm_connection_send (conn, m, &error)) {
                g_print ("Error while sending message to '%s':\n%s\n",
                         argv[4], error->message);
        }
 
        lm_message_unref (m);

        g_main_loop_run (g_main_loop_new (NULL, FALSE));

        lm_connection_close (conn, NULL);
        lm_connection_unref (conn);
 
        return 0;
}

static LmHandlerResult lm_message_handle (LmMessageHandler *handler,
                                   LmConnection *conn, LmMessage *msg, gpointer data)
{
    LmMessageNode *root_node = lm_message_get_node (msg);
    LmMessageNode *body_node = lm_message_node_get_child (root_node, "body");
    const gchar *value;
    const gchar *from = lm_message_node_get_attribute (root_node, "from");

    if (body_node)
    {
        value = lm_message_node_get_value (body_node);
        printf("recv msg(from \'%s\'): %s\n", from, value);
    }

    return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
}

保存为 xmpp_test.c,用如下命令编译即可:
gcc -g -O0 -o xmpp_test `pkg-config --cflags --libs loudmouth-1.0` xmpp_test.c

 4) 测试     

 生成测试程序 xmpp_test,现在终于可以测试了。
./xmpp_test talk.l.google.com xxxxx@gmail.com passworld yyyy@gmail.com hello

上面命令的第一个参数是google talk的服务器,其余的就不用说了吧。不出意外的话yyyy@gmail.com就能收到xxxxx@gmail.com发送的消息“hello”。(如果你开着yyyy@gmail.com这个gmail,就能在gmail中看到这条消息啦)
测试程序最后进入main loop。如果有别人发送来的消息便打印出来。
代码中的
         ssl = lm_ssl_new (NULL, NULL, NULL, NULL);
         lm_ssl_use_starttls (ssl, TRUE, TRUE);
         lm_connection_set_ssl (conn, ssl);

是不可少的,不然连不上google talk。关于xmpp的更多信息请查看http://xmpp.org

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值