google talk的通信协议采用的是xmpp,xmpp是开放协议。gmail邮箱中的聊天功能就是基于这个协议实现的吧。xmpp客户端协议都多种语言实现包括 javascript,c,c++,c#,python等。
loudmouth是xmpp客户端协议的轻量级易于使用的c语言实现。目前正在发展中,虽然功能还不丰富,但基本的功能都已具备。
下载目前(2011-02-20)的最新版。加压后执行著名的“./configure ; make ; make install”三部曲即可。但有些事情需要注意
b)连接google talk 服务器需要ssl支持,loudmouth支持gnutls和openssl,我使用的是openssl。在configure的时候要把ssl的支持打开,for example
废话不多说了贴代码吧。
保存为 xmpp_test.c,用如下命令编译即可:
上面命令的第一个参数是google talk的服务器,其余的就不用说了吧。不出意外的话yyyy@gmail.com就能收到xxxxx@gmail.com发送的消息“hello”。(如果你开着yyyy@gmail.com这个gmail,就能在gmail中看到这条消息啦)
测试程序最后进入main loop。如果有别人发送来的消息便打印出来。
代码中的
是不可少的,不然连不上google talk。关于xmpp的更多信息请查看http://xmpp.org
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