文档章节

基于loudmouth的XMPP客户端DEMO

linuxhunter
 linuxhunter
发布于 2011/11/17 16:37
字数 426
阅读 1679
收藏 1

这几天在公司一直在研究XMPP客户端软件DEMO的编写,下面的源代码是基于开源库loudmouth-1.4.3的XMPP客户端源代码。这段代码只是一个Demo,使用一个已经在服务器上注册了的用户登录到XMPP服务器,最后在XMPP服务器上发送iq信息,在客户端获取该IQ信息后解析该信息。

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <loudmouth.h>

 

#define XMPP_SERVER "192.168.175.211"

#define XMPP_USERNAME "tm"

#define XMPP_PASSWORD "12345"

#define XMPP_RESOURCE "AndroidpnClient"

 

LmHandlerResult iq_handler_message(LmMessageHandler *handler, LmConnection *connection, LmMessage *m, gpointer user_data)

{

LmMessageNode *root_node, *node;

 

printf("[RECEIVED]:%s\n", lm_message_node_to_string(lm_message_get_node(m)));

root_node = lm_message_get_node(m);

node = lm_message_node_find_child(root_node, "title");

printf("title = %s\n", lm_message_node_get_value(node));

node = lm_message_node_find_child(root_node, "message");

printf("message = %s\n", lm_message_node_get_value(node));

node = lm_message_node_find_child(root_node, "uri");

printf("uri = %s\n", lm_message_node_get_value(node));

lm_message_node_unref(node);

lm_message_node_unref(root_node);

return LM_HANDLER_RESULT_REMOVE_MESSAGE;

}

 

 

int main(int argc, char **argv)

{

LmConnection *connection;

LmSSL *ssl;

GError *error = NULL;

LmMessage *m, *child_m, *response_m;

LmMessageNode *m_node, *child_node, *child;

gboolean use_sasl;

int i;

LmMessageHandler *iq_handler;

GMainLoop        *main_loop;

//create a new closed connection

connection = lm_connection_new(XMPP_SERVER);

if (connection == NULL) {

printf("lm_connection_new(%s) error.\n", XMPP_SERVER);

return -1;

}

//connection uses starttls 

ssl = lm_ssl_new(NULL, NULL, NULL, NULL);

lm_ssl_use_starttls(ssl, TRUE, FALSE);

lm_connection_set_ssl(connection, ssl);

//register iq message handler to the connection 

iq_handler = lm_message_handler_new(iq_handler_message, NULL, NULL);

lm_connection_register_message_handler (connection, iq_handler, LM_MESSAGE_TYPE_IQ, LM_HANDLER_PRIORITY_NORMAL);

lm_message_handler_unref(iq_handler);

//open the connection to create socket with server

if (!lm_connection_open_and_block(connection, &error)) {

g_error("Failed to open:%s\n", error->message);

}

//check the open state of connection

if (lm_connection_is_open(connection)) {

printf("connection to %s [OPENED].\n", XMPP_SERVER);

} else {

printf("connection to %s [FAILED].\n", XMPP_SERVER);

}

//authenticate the specific user/password/resource to the server

if (!lm_connection_authenticate_and_block(connection, XMPP_USERNAME, XMPP_PASSWORD, XMPP_RESOURCE, &error)) {

g_error("Failed to authenticate:%s\n", error->message);

}

//check the authentication state of connection

if (lm_connection_is_authenticated(connection)) {

printf("[%s/%s/%s] is AUTHENTICATION.\n", XMPP_USERNAME, XMPP_PASSWORD, XMPP_RESOURCE);

} else {

printf("[%s/%s/%s] is AUTHENTICATION FAILED.\n", XMPP_USERNAME, XMPP_PASSWORD, XMPP_RESOURCE);

}

//send presence message to server to indicate online 

m=lm_message_new(NULL, LM_MESSAGE_TYPE_PRESENCE);

if (!lm_connection_send(connection, m, &error)) {

printf("Failed to send:%s\n", error->message);

}

lm_message_unref(m);

//gogot glib main loop to receive server push message 

main_loop = g_main_loop_new (NULL, FALSE);

g_main_loop_run (main_loop);

//close connection

lm_connection_close(connection, NULL);

lm_connection_unref(connection);

return 0;

}


© 著作权归作者所有

linuxhunter
粉丝 72
博文 144
码字总数 93264
作品 0
沈阳
高级程序员
私信 提问
XMPP协议及实践

一、XMPP协议 XMPP (Extensible Messaging and Presence Protocol可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测。XMPP的前身是Jabbe...

xn4545945
2014/08/31
0
0
CIM 2.2.0 发布,新增 Java 版本客户端

CIM 2.2.0 发布了,基于Java服务端的即时通信解决方案,与android 客户端完美结合,同时支持其他语言的移动应用,桌面应用,以及后台系统之间的即时消交互,为你解决了长连接各种消息事件,断...

远方夕阳
2016/07/18
2.4K
3
XMPP协议

XMPP(Extensible Messageing and Presence Protocol)可扩展消息与存在协议,是目前主流的四种IM(即时消息)协议之一,其它三种分别为:即时信息和空间协议(IMPP)、空间和即时信息协议(PR...

长平狐
2013/01/06
722
1
CIM 2.1.0 发布,即时通讯方案

CIM 2.1.0 发布了,基于apache mina 的 java即时通讯服务端。与android 客户端完美结合,同时支持其他语言(ios,c,ActionScript,.net等)客户端的即时通信。 说明: 此开源版本为基础功能版本...

远方夕阳
2016/07/14
3.3K
6
xmpp openfire linux 安装 im 及时通讯服务器

xmpp openfire linux 安装 im 及时通讯服务器 技术栈: openfire+smack+spark Smack是一个开源,易于使用的XMPP客户端类库。Smack API, 是一个 Java 的XMPP Client Library,也是由Jive Soft...

curiousby
2017/10/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

006-Docker中导出单个或多个tar包

docker中导出单个镜像和多个镜像的tar包 docker save [images] > [name.tar] docker save [images] [images] > [name.tar]...

伟大源于勇敢的开始
15分钟前
4
0
Kotlin基础语法学习

安装好安卓studio,以及插件支持Kotlin 就可以在创建项目的时候选择 Kotlin语言了。 https://www.jianshu.com/p/4ab13691d681 参考手册: https://www.runoob.com/kotlin/otlin-android-setu...

T型人才追梦者
39分钟前
4
0
java实现简单计算器

1.概述 之前作者写过一篇文章,也是关于计算器的,用的是C++与Qt,链接在这里 这次用java的swing写的(这差距好像有点大,好吧是qt太强了). 先上图: 2.UI 总体布局使用流布局. (1)文本框 文本框就...

Blueeeeeee
41分钟前
4
0
纯CSS实现DIV悬浮(固定位置)

纯CSS实现的DIV悬浮效果(固定位置),兼容常用的浏览器:IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗等。效果如下: 实现代码: <!DOCTYPE html> <html> <head> <meta ...

独钓渔
今天
5
0
OSChina 周二乱弹 —— 给我来个女菩萨

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐#分享XXXTENTACION/Travis Barker的单曲《Pain = BESTFRIEND》: 《Pain = BESTFRIEND》- XXXTENTACION/...

小小编辑
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部