Jabberd2源码分析: 客户端BIND

客户端资源绑定

 

当客户端身份验证成功后,服务器端features中指定需要BIND资源,则客户端发送bind请求。

 

client->c2s:

<iq type="set" id="32"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>Gajim</resource></bind></iq>

 

当收到服务器的stream:features中包含了<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><required></bind>后,说明服务器必须要求客户端BIND资源。

 

客户端同样必须发送一个符合'urn:ietf:params:xml:ns:xmpp-bind'名字空间的'set'类型的IQ节给服务器绑定一个资源到流中。客户端也可以不指定资源ID,而由服务器自动生成,也可以自己生成一个资源ID,但服务器有权利选择是否使用客户端自己生成的。

 

这条消息最终执行到函数_c2s_client_sx_callback(sx_event_t = event_PACKET)

在case event_PACKET中有这样的判断:

if((ns = nad_find_scoped_namespace(nad, uri_BIND, NULL)) >= 0 && 

   (elem = nad_find_elem(nad, 0, ns, "bind", 1)) >= 0 && 

   nad_find_attr(nad, 0, -1, "type", "set") >= 0)

符合这个判断,执行if里的代码, 服务器选择使用用户自定义的资源ID或者生成资源ID, 

然后必须返回一个'result'类型的IQ节给客户端,这个节必须包含一个指明全JID的</jid>子元素表示服务器决定连接的资源。

调用sm_start函数,构造一个发送给router的协议:

c2s->router:

<route xmlns='http://jabberd.jabberstudio.org/ns/component/1.0' from='c2s' to='easyjabberd.com'><sc:session xmlns:sc='http://jabberd.jabberstudio.org/ns/session/1.0' id='656be3f310b717525c441e1335345bde0232b00a' target='zhanghua@easyjabberd.com/Gajim' action='start' sc:c2s='8'/></route>

 

这里忽略对router的分析,针对router程序我会专门在新的文章中分析。

 

router->c2s:

<route xmlns='http://jabberd.jabberstudio.org/ns/component/1.0' to='c2s' from='sm'><sc:session xmlns:sc='http://jabberd.jabberstudio.org/ns/session/1.0' sc:c2s='8' action='started' target='zhanghua@easyjabberd.com/Gajim' id='656be3f310b717525c441e1335345bde0232b00a' sc:sm='f88d031a7954dc9cb162670c53a5c942b27034c1'/></route>

 

由于是router发回来的数据,会调用c2s_router_sx_callback函数

在case event_PACKET中if(strncmp("started", NAD_AVAL(nad, action), 7) == 0)的判断,执行这里的代码。

在sm_start函数之前的时候,c2s在处理客户端发送的bind请求的时候,已经构造好了返回的result的iq节。但当时没有发送,就是等待router发送started后发送。

 

c2s->client:

<iq xmlns='jabber:client' id='32' type='result'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><jid>zhanghua@easyjabberd.com/Gajim</jid></bind></iq>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值