Chinaunix首页 | 论坛 | 博客
  • 博客访问: 43334
  • 博文数量: 3
  • 博客积分: 321
  • 博客等级: 一等列兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-25 14:20
文章分类
文章存档

2011年(2)

2010年(1)

我的朋友

分类: LINUX

2011-02-20 16:18:47

google talk的通信协议采用的是,xmpp是开放协议。gmail邮箱中的聊天功能就是基于这个协议实现的吧。xmpp客户端协议都多种语言实现包括 javascript,c,c++,c#,python等。

loudmouth是xmpp客户端协议的轻量级易于使用的c语言实现。目前正在发展中,虽然功能还不丰富,但基本的功能都已具备。


1)下载并编译loudmouth
      wget
    下载目前(2011-02-20)的最新版。加压后执行著名的“./configure ; make ; make install”三部曲即可。但  有些事情需要注意
    a)loudmouth依赖glib库(gnome平台的c基础库)。使用

          
  1. 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

  1. ../configure --prefix=/usr/local --with-ssl=openssl CFLAGS=“-g -O0”
          加上-g -O0便于调试

2)查看安装结果
       根据上面的配置,我安装到了 /usr/local 下。所以执行
  1. 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 之类的。
   废话不多说了贴代码吧。

  1. #include <loudmouth/loudmouth.h>
  2. #include <stdio.h>

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

  5. int
  6. main (int argc, char **argv)
  7. {
  8.         LmConnection *conn;
  9.         GError *error = NULL;
  10.         LmMessage *m;
  11.         LmSSL *ssl;
  12.         LmMessageHandler *msghandler;
  13.  
  14.         if (argc < 6) {
  15.                 g_print ("Usage: test server username password recipient message");
  16.                 return -1;
  17.         }
  18.  
  19.         conn = lm_connection_new (argv[1]);

  20.         ssl = lm_ssl_new (NULL, NULL, NULL, NULL);
  21.         lm_ssl_use_starttls (ssl, TRUE, TRUE);
  22.         lm_connection_set_ssl (conn, ssl);
  23.  
  24.         if (!lm_connection_open_and_block (conn, &error)) {
  25.                 g_print ("Couldn't open connection to '%s':\n%s\n",
  26.                          argv[1], error->message);
  27.                 return -1;
  28.         }
  29.  
  30.         if (!lm_connection_authenticate_and_block (conn, argv[2], argv[3],
  31.                                                    "MyTestApp", &error)) {
  32.                 g_print ("Couldn't authenticate with '%s' '%s':\n%s\n",
  33.                          argv[2], argv[3], error->message);
  34.                 return -1;
  35.         }

  36.         msghandler = lm_message_handler_new (lm_message_handle, NULL, NULL);
  37.          lm_connection_register_message_handler (conn, msghandler, LM_MESSAGE_TYPE_MESSAGE,
  38.          LM_HANDLER_PRIORITY_LAST);

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

  48.         g_main_loop_run (g_main_loop_new (NULL, FALSE));

  49.         lm_connection_close (conn, NULL);
  50.         lm_connection_unref (conn);
  51.  
  52.         return 0;
  53. }

  54. static LmHandlerResult lm_message_handle (LmMessageHandler *handler,
  55.                                    LmConnection *conn, LmMessage *msg, gpointer data)
  56. {
  57.     LmMessageNode *root_node = lm_message_get_node (msg);
  58.     LmMessageNode *body_node = lm_message_node_get_child (root_node, "body");
  59.     const gchar *value;
  60.     const gchar *from = lm_message_node_get_attribute (root_node, "from");

  61.     if (body_node)
  62.     {
  63.         value = lm_message_node_get_value (body_node);
  64.         printf("recv msg(from \'%s\'): %s\n", from, value);
  65.     }

  66.     return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
  67. }
      保存为 xmpp_test.c,用如下命令编译即可:
  1. gcc -g -O0 -o xmpp_test `pkg-config --cflags --libs loudmouth-1.0` xmpp_test.c
 4) 测试    
      生成测试程序 xmpp_test,现在终于可以测试了。
  1. ./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。如果有别人发送来的消息便打印出来。
    代码中的

  1.          ssl = lm_ssl_new (NULL, NULL, NULL, NULL);
  2.          lm_ssl_use_starttls (ssl, TRUE, TRUE);
  3.          lm_connection_set_ssl (conn, ssl);
     是不可少的,不然连不上google talk。关于xmpp的更多信息请查看
阅读(4356) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~