libpomelo2 可以使用ssl/tls了!!!

libpomelo2 是对原来的libpomelo做了很大的重构,更简洁的接口,更好的扩展性,更易于使用,更强大的功能。

在README中给出了相应的编译选项。

在test目录下,有用C写的例子,在py和java目录下,有对应的py和java绑定以及具体使用的例子。

测试用的服务端代码在test目录下的game-server中,需要使用最新的pomelo 1.1.0(即将发布, github上的master的最新版本)...

特性

  • client层与transport层分离,用户可以完全不依赖uv,重新全部重写了transport层

  • 默认实现了三个transport,dummy, uv_tcp, uv_tls, dummy是一个假的transport,uv_tcp和uv_tls分别对应pomelo服务端的hybridconnector以及配置了ssl的hybridconnector,用户可以根据自己的需求,定制符合自己的transport

  • 没有多余的头文件依赖,如果用户仅仅使用内建的transport开发的话,仅仅包含一个pomelo.h即可。

  • 提供了用户主动poll的方式,不仅仅只是以前的基于回调的方式。用户开启polling模式后,当有网络事件发生时,后台线程不会调用用户注册的回调函数,而是对具体的事件进行排队。用户需要在合适的时候,调用poll,此时才会触发回调函数的调用,这样可以保证回调函数还在用户自己的线程调用,而不是内部的网络线程。

  • 更灵活的编译配置,tls实现中使用了openssl, 用户可以通过编译选项来控制是使用系统中已经预装的openssl,还是使用libpomelo2内包含的openssl静态编译进libpomelo2中, 同样,对于依赖的uv,jansson,用户都可以通过编译选项来控制是使用系统中已经预装的还是使用libpomelo2的deps/子目录下,静态编译的

  • 更方便的多语言绑定,接口设计的时候,充分考虑了多语言绑定,目前已经完成了java和python的绑定,并有相关的例子

  • 用户可以在编译时,通过选项来控制是否开启tls支持,使用使用uv支持等。比如,如果用户重新实现了自己的transport,那么就可以完全关闭uv和tls,这样uv和openssl的代码将不会被编译和链接

TODO

  • 整理文档 目前已经完成了开发,但是文档没有很好的整理,各位大牛们,有时间的话,欢迎contributing, 我们也会整理出来一份API文档的。

  • 更好的编译支持 目前仅仅提供了一个gyp编译脚本,后续希望有更多的编译脚本,比如cmake脚本,用于Android的Android.mk,用于VS系列编译器的sln等等,希望大家多多分享,毕竟我们自己也没有那么全的各种编译环境,单凭我们自己确实很难做到很好的支持.

  • 更多的语言绑定 目前仅仅做了java和python的绑定,希望能有更多的语言绑定,欢迎各位贡献,例如Lua,CSharp等..

  • 更全的单元测试 由于在开发的时候,更多地在想尽快的成形,因此并没有很好地写更多的单元测试,希望大家能帮着完善....

  • 更多的测试和持续的bugfix: libpomelo2 刚刚完成开发,并没有经过太多的测试,希望大家能够多多使用,多多提bug,多多吐槽,多多拍砖...

  • 持续的实现上的优化..

千万注意

  • 在libpomelo2中,在一个event handler的回调函数中,如果调用了 pc_client_rm_ev_handler,并且是移除的恰好是这个event handler本身的话,将造成程序陷入死循环或者直接崩溃,千万不要这么做。

  • 在libpomelo2的java绑定中,没有实现 pc_client_rm_ev_handler。同时也不建议用户挂太多的ev_handler实例,因为一个实例就可以处理所有的事件,否则,可能会有内存泄漏的

  • 每一个transport都可以返回自定义的internal_data, 对于uv_tcp这个transport,其返回的是其使用的uv_loop_t指针, 对于uv_tls,返回的是一个有两个元素的数组,第一个元素是uv_loop_t指针, 第二个是SSL指针,用户如果需要可以使用(大牛们,估计看代码,就直接看出来了,不用我在这里罗嗦了)

最后

  • 如果大家有任何想法,意见,想骂人的,想说脏话的,千万别憋着,都可以在这个帖子里写出来,我们很欢迎....

  • 关于pomelo 客户端,可能大家已经注意到好多pomelo的客户端SDK都很久没有更新了。确实,碎片化的各个平台的SDK,很难进行很好的维护。以后,将会仅仅支持js客户端和libpomelo2以及其延伸的各种语言绑定,这样的好处是能更好的维护各个客户端的统一并及时更新,因为接口保持稳定,所以各种绑定代码一旦写好,将不会轻易被修改,仅仅需要对libpomelo2做bugfix,优化以及增加新特性即可。

  • 本帖子中,敲得比较仓促,有错别字啥的,大家别见怪

  • 谢谢!!!!!

忘了告诉大家地址了~~

标签:无
wangxy 在 2014-9-3 20:00发布
wangxy 在 2014-9-3 20:12重新编辑 分享到 weibo
58 回复
#1 py8765 2014-9-3 22:07 回复

赞~

#2 fantasyni 2014-9-4 15:38 回复

顶~

#3 lellansin 2014-9-4 16:35 回复

前排~

#4 {4} qklxtlx 2014-9-4 23:53 回复

协议层没有变化吧

wangxy 2014-9-5 09:28 回复

@qklxtlx 协议层有少许变化:

  • 心跳修改为客户端主动发心跳,服务端不再主动发心跳,仅仅对心跳进行响应以及检测心跳超市,客户端使用心跳的rtt时间作为连接质量的衡量指标

  • 握手协议的时候,proto文件以及dict文件的版本号计算方式统一使用base64编码的md5, 无论是dict还是proto,都允许客户端缓存。另外,为了更容易解析,dict信息不仅仅下发route2code,一并连code2route也下发了,省得客户端做解析了。

  • 这些协议的调整考虑到了兼容,与原来的协议是原来兼容的。

qklxtlx 2014-9-6 08:32 回复

@wangxy 嗯嗯赞!dict的md5缓存当时我实现之后提交PR到libpomelo不过没人理我哈哈

wangxy 2014-9-6 10:55 回复

@qklxtlx 那个pr也是有问题的,在dict上直接加version属性是可能造成冲突的,服务端的也已经改掉了,dictVersion应该成为一个单独的字段的。而且发现客户端SDK太杂,任何一次协议的修改都很艰难,这也是决定统一所有客户端支持的原因。 感谢提出的建议以及支持,多谢!

qklxtlx 2014-9-6 15:38 回复

@wangxy 嗯这个是肯定理解~我的意思是最好给点反馈,有问题可以再说,确实也不可能每个PR都合并

#5 {5} bbs3723216 2014-9-5 12:10 回复

JAVA的如何编译啊 亲~

wangxy 2014-9-5 12:29 回复

@bbs3723216

-Dbuild_jpomelo=true, 然后就会自动编译出来libjpomelo

bbs3723216 2014-9-5 12:50 回复

我在WIN平台生成了SLN文件,但是生成解决方案一直报错。。N个错啊编译不了

wangxy 2014-9-5 13:27 回复

@bbs3723216

由于是在debian下开发的, 上午已经修了好几处在win下编译出问题的bug了

wangxy 2014-9-5 13:28 回复

@bbs3723216 还有就是一个编译选项 /TP,虽然gyp里面配了,但是好像生成的sln里面没有带上,可以手动加上,就是编译配置的 命令行参数里面

bbs3723216 2014-9-5 13:33 回复

@wangxy 好的我试试

#6 {2} bbs3723216 2014-9-5 12:32 回复

好的我试试1.1的服务端哪里下载呢亲爱的

wangxy 2014-9-5 13:28 回复

1.1 的服务端还没发布,就是目前master分支上的最新版,你拉下来,然后npm link一下吧

bbs3723216 2014-9-5 13:33 回复

@wangxy 好的谢谢~

#7 {1} jiangzhuo 2014-9-5 12:48 回复

希望lua的綁定儘快出啊~

jiangzhuo 2014-9-11 15:51 回复

@wangxy @fantasyni 什麼時候出lua的綁定啊~ ~ ~ 急用

#8 bbs3723216 2014-9-5 14:54 回复

MAKE出问啊啊~~~

In file included from src/tr/uv/pr_msg.c:14:
src/tr/uv/tr_uv_tcp_i.h:21: error: redefinition of typedef ‘tr_uv_tcp_transport_t’
src/tr/uv/pr_msg.h:14: note: previous declaration of ‘tr_uv_tcp_transport_t’ was here
src/tr/uv/tr_uv_tcp_i.h:144: error: redefinition of typedef ‘tr_uv_tcp_transport_t’
src/tr/uv/tr_uv_tcp_i.h:21: note: previous declaration of ‘tr_uv_tcp_transport_t’ was here
make: * [out/Default/obj.target/libpomelo2/src/tr/uv/pr_msg.o] Error 1

#9 {4} bbs3723216 2014-9-5 15:40 回复

@wangxy @wangxy @wangxy @wangxy @wangxy @wangxy 在不在啊,编译出问题啊

CC(target) out/Default/obj.target/libpomelo2/src/pc_pomelo.o
CC(target) out/Default/obj.target/libpomelo2/src/pc_lib.o
CC(target) out/Default/obj.target/libpomelo2/src/pc_trans.o
CC(target) out/Default/obj.target/libpomelo2/src/pc_trans_repo.o
CC(target) out/Default/obj.target/libpomelo2/src/tr/dummy/tr_dummy.o
CC(target) out/Default/obj.target/libpomelo2/src/tr/uv/pr_msg.o
In file included from src/tr/uv/pr_msg.c:14:
src/tr/uv/tr_uv_tcp_i.h:21: error: redefinition of typedef ‘tr_uv_tcp_transport_t’
src/tr/uv/pr_msg.h:14: note: previous declaration of ‘tr_uv_tcp_transport_t’ was here
src/tr/uv/tr_uv_tcp_i.h:144: error: redefinition of typedef ‘tr_uv_tcp_transport_t’
src/tr/uv/tr_uv_tcp_i.h:21: note: previous declaration of ‘tr_uv_tcp_transport_t’ was here

wangxy 2014-9-5 16:20 回复

什么系统的,用了什么编译参数

wangxy 2014-9-5 16:31 回复

编译参数不同,有些可能是警告,有些可能是错误,报的那个地方确实写得不规范,现在已经修正了

bbs3723216 2014-9-5 16:39 回复

@wangxy 就-Dbuild_jpomelo=true 然后直接MAKE,CENTOS6.5的系统,麻烦能否帮忙看下,我这边赶着换客户端呢。。。。谢谢了~

bbs3723216 2014-9-5 16:50 回复

@wangxy 坐等修复啊,兄弟~~~

#10 {3} bbs3723216 2014-9-5 17:03 回复

@wangxy 现在只剩下一个了
CC(target) out/Default/obj.target/libpomelo2/src/pc_trans.o
CC(target) out/Default/obj.target/libpomelo2/src/pc_trans_repo.o
CC(target) out/Default/obj.target/libpomelo2/src/tr/dummy/tr_dummy.o
CC(target) out/Default/obj.target/libpomelo2/src/tr/uv/pr_msg.o
In file included from src/tr/uv/pr_msg.c:14:
src/tr/uv/tr_uv_tcp_i.h:21: error: redefinition of typedef ‘tr_uv_tcp_transport_t’
src/tr/uv/pr_msg.h:14: note: previous declaration of ‘tr_uv_tcp_transport_t’ was here
make: * [out/Default/obj.target/libpomelo2/src/tr/uv/pr_msg.o] Error 1

wangxy 2014-9-5 17:15 回复

你再试一下吧, 两次typedef struct A B; 应该是合法的, 不知道你这里为啥报了redefinition

bbs3723216 2014-9-5 17:16 回复

@wangxy 对啊我也觉得莫名其妙

bbs3723216 2014-9-5 17:19 回复

@wangxy 已经看到FIX我再试试~

#11 {4} bbs3723216 2014-9-5 17:16 回复

@wangxy 要不你直接把debian下的编译MAKE参数给我,我装个debian编译吧

wangxy 2014-9-5 17:19 回复

我又推了最新的,你试一下

bbs3723216 2014-9-5 17:20 回复

@wangxy 恩看到了 我正在下载

bbs3723216 2014-9-5 17:24 回复

@wangxy 之前的不报错了,来新的错误了~不好意思啊

CC(target) out/Default/obj.target/libpomelo2/src/tr/uv/pr_pkg.o
CC(target) out/Default/obj.target/libpomelo2/src/tr/uv/tr_uv_tcp.o
CC(target) out/Default/obj.target/libpomelo2/src/tr/uv/tr_uv_tcp_i.o
CC(target) out/Default/obj.target/libpomelo2/src/tr/uv/tr_uv_tcp_aux.o
CC(target) out/Default/obj.target/libpomelo2/src/tr/uv/tr_uv_tls.o
In file included from src/tr/uv/tr_uv_tls.c:12:
src/tr/uv/tr_uv_tls_i.h:9:25: warning: openssl/ssl.h: No such file or directory
src/tr/uv/tr_uv_tls_i.h:10:25: warning: openssl/bio.h: No such file or directory
src/tr/uv/tr_uv_tls_i.h:11:25: warning: openssl/err.h: No such file or directory
In file included from src/tr/uv/tr_uv_tls.c:12:
src/tr/uv/tr_uv_tls_i.h:20: error: expected specifier-qualifier-list before ‘SSL’
src/tr/uv/tr_uv_tls_i.h:38: error: expected specifier-qualifier-list before ‘SSL_CTX’
src/tr/uv/tr_uv_tls.c:27: warning: excess elements in struct initializer
src/tr/uv/tr_uv_tls.c:27: warning: (near initialization for ‘instance’)
src/tr/uv/tr_uv_tls.c:29: warning: excess elements in struct initializer
src/tr/uv/tr_uv_tls.c:29: warning: (near initialization for ‘instance’)
src/tr/uv/tr_uv_tls.c: In function ‘tr_uv_tls_set_ca_file’:
src/tr/uv/tr_uv_tls.c:39: error: ‘tr_uv_tls_transport_plugin_t’ has no member named ‘ctx’
src/tr/uv/tr_uv_tls.c:40: error: ‘tr_uv_tls_transport_plugin_t’ has no member named ‘ctx’
src/tr/uv/tr_uv_tls.c:43: error: ‘tr_uv_tls_transport_plugin_t’ has no member named ‘enable_verify’
src/tr/uv/tr_uv_tls.c:45: error: ‘tr_uv_tls_transport_plugin_t’ has no member named ‘enable_verify’
make: * [out/Default/obj.target/libpomelo2/src/tr/uv/tr_uv_tls.o] Error 1

wangxy 2014-9-5 17:29 回复

@bbs3723216 你机器里面没有装openssl,你有两种选择,如果需要tls支持,可以把ssl以源码的方式加到libpomelo2里;如果不需要直接disable掉即可,如下

-Dno_tls_support=true

或者

-Duse_sys_openssl=false -Dtarget_arch=[ia32|x64|other..]

或者

安装openssl的开发包

注: 那个target_arch参数是openssl用来做优化的依据,一般用ia32或者x64的,如果有问题的,也可以乱写一个,大不了不优化

#12 {4} bbs3723216 2014-9-5 20:24 回复

@wangxy JAVA调用JLIBPOLELO.SO出问题啦··装载不了

wangxy 2014-9-5 20:35 回复

是提示找不到,还是错误,如果是找不到说明路径没有配对。在java/下, 可以将生成的libjpomelo.so 拷到java目录下,然后 试试

java -Djava.library.path=. com.netease.pomelo.Test
wangxy 2014-9-5 20:39 回复

如果是运行过程中崩溃或则断言失败之类的,欢迎报bug

bbs3723216 2014-9-5 20:39 回复

@wangxy 具体我应该是在安卓下,我给你错误代码
Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/netease/pomelo/Client;

bbs3723216 2014-9-5 20:41 回复

@wangxy 会的 持续关注

#13 {1} bbs3723216 2014-9-5 20:49 回复

@wangxy libjpomelo.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
我的SO文件信息没错吧

wangxy 2014-9-5 20:56 回复

你如果是centos系统的话,你现在centos上试试能不能跑

在安卓下的编译需要NDK吧,而且显然android下应该是arm版本的,不应该是386的

#14 {15} bbs3723216 2014-9-5 20:54 回复

@wangxy 抛出的异常
java.lang.UnsatisfiedLinkError: Cannot load library: get_lib_extents[742]: 1558 - /data/data/com.netease.pomelo/lib/libjpomelo.so is not a valid ELF object

wangxy 2014-9-5 20:58 回复

就是了,一个是386的,一个需要的是arm版本的

bbs3723216 2014-9-5 20:59 回复

@wangxy 如何编译ARM版本的SO?

bbs3723216 2014-9-5 20:59 回复

@wangxy 我也发现平台问题··

bbs3723216 2014-9-5 21:02 回复

@wangxy 用JAVA绑定的大多数安卓客户端开发吧,这个问题还是要说明下,才不会走弯路

wangxy 2014-9-5 21:04 回复

@bbs3723216 NDK 的交叉编译呀,但是现在没有提供NDK使用的编译脚本,你可以贡献一个

wangxy 2014-9-5 21:05 回复

@bbs3723216 很多情况下,因为用户都是程序员,都假定大家知道的

wangxy 2014-9-5 21:09 回复

@bbs3723216 计划提供一个cmake脚本,gyp有点小众

bbs3723216 2014-9-5 21:10 回复

@wangxy 小弟技术较差,还真不知道怎么把这个用NDK编译供按照使用呢。

wangxy 2014-9-5 21:15 回复

@bbs3723216 真的不好意思,我们还没有提供一个比较简单的供NDK用的编译方法,打算弄个.mk文件的,现在还没弄,不过以后打算尽量都统一到cmake上

bbs3723216 2014-9-5 21:18 回复

@wangxy 这个大概多久时间啊?

wangxy 2014-9-5 21:22 回复

@bbs3723216 原来libpomelo有一个Android.mk脚本的,现在这个还没来得及移植

移植应该很快的,你也可以参考着,做一个移植

bbs3723216 2014-9-5 21:23 回复

@wangxy 可以我明天试试吧···今天被弄的精疲力尽了,有机会多交流···

wangxy 2014-9-9 12:53 回复

@bbs3723216

弄了一个android脚本,你可以先试一下,具体方式如下:

  • 下载ndk,版本尽量高点,解压

  • 执行 android-toochain.sh <ndk_dir>, 这个脚本将根据具体的配置,构建一个独立的android toolchain,参数ndk_dir即是你解压的ndk目录,你也可以修改这个脚本满足自己的需求,

  • 在同一个shell下,执行android-gen.sh, 因为这个脚本的执行依赖于android-toolchain的执行

  • 此时将生成Makefile,然后make即可,即可得到 libjpomelo.so

  • 使用file命令查看,如果是ARM的ELF,说明构建成功

bbs3723216 2014-9-10 11:00 回复

@wangxy 好的谢谢

vmespace 2014-9-29 14:09 回复

@wangxy 必须在linux环境下么?

#15 {3} philips123 2014-9-9 16:10 回复

Poll的模式,是不是就是实现了类似于CCPomelo的封装呢?

wangxy 2014-9-9 17:05 回复

@philips123 是滴,有点类似

philips123 2014-9-9 17:18 回复

@wangxy 那这样的话,是不是可以在cocos2d里面直接使用,而不会阻塞cocos2d的主线程了?

fantasyni 2014-9-9 18:34 回复

@philips123 正是如此哦

#16 bbs3723216 2014-9-10 11:22 回复

@wangxy

deps/uv/src/unix/pthread-fixes.c:39: warning: type defaults to ‘int’ in declaration of ‘sigset_t’
deps/uv/src/unix/pthread-fixes.c:39: error: expected ‘;’, ‘,’ or ‘)’ before ‘’ token
make: *
* [out/Default/obj.target/libuv/deps/uv/src/unix/pthread-fixes.o] Error 1
[root@iZ23p8bfdl5Z libpomelo2-master]#

#17 bbs3723216 2014-9-10 11:54 回复

@wangxy 看了这个代码是没问题的啊

#18 bbs3723216 2014-9-10 11:55 回复

@wangxy 改了头文件包含顺序就报如下错误
CC(target) out/Default/obj.target/libuv/deps/uv/src/unix/android-ifaddrs.o
deps/uv/src/unix/android-ifaddrs.c: In function ‘calcAddrLen’:
deps/uv/src/unix/android-ifaddrs.c:270: error: invalid application of ‘sizeof’ t o incomplete type ‘struct sockaddr_ll’
deps/uv/src/unix/android-ifaddrs.c:270: warning: implicit declaration of functio n ‘offsetof’
deps/uv/src/unix/android-ifaddrs.c:270: error: expected expression before ‘struc t’
deps/uv/src/unix/android-ifaddrs.c:272: error: expected expression before ‘struc t’
deps/uv/src/unix/android-ifaddrs.c: In function ‘makeSockaddr’:
deps/uv/src/unix/android-ifaddrs.c:287: error: dereferencing pointer to incomple te type
deps/uv/src/unix/android-ifaddrs.c:288: error: dereferencing pointer to incomple te type
deps/uv/src/unix/android-ifaddrs.c: In function ‘interpretLink’:
deps/uv/src/unix/android-ifaddrs.c:383: error: dereferencing pointer to incomple te type
deps/uv/src/unix/android-ifaddrs.c:384: error: dereferencing pointer to incomple te type
deps/uv/src/unix/android-ifaddrs.c: In function ‘interpretAddr’:
deps/uv/src/unix/android-ifaddrs.c:565: warning: overflow in implicit constant c onversion
make: * [out/Default/obj.target/libuv/deps/uv/src/unix/android-ifaddrs.o] Erro r 1

#19 {4} bbs3723216 2014-9-10 14:46 回复
wangxy 2014-9-10 15:02 回复

应该是uv代码的问题

wangxy 2014-9-10 15:04 回复

你的NDK版本是什么

wangxy 2014-9-10 15:10 回复

你拉一下最新的吧,最新的已经把ifaddrs和pr_set_name disable 掉了

bbs3723216 2014-9-10 16:47 回复

@wangxy 好的谢谢,NDK是10的

#20 bbs3723216 2014-9-10 16:56 回复

@wangxy @wangxy 下载最新的一样有问题啊

#21 {5} bbs3723216 2014-9-10 16:57 回复

@wangxy @wangxy @wangxy @wangxy
[root@iZ23p8bfdl5Z libpomelo2-master]# make
CC(target) out/Default/obj.target/libuv/deps/uv/src/unix/pthread-fixes.o
deps/uv/src/unix/pthread-fixes.c:39: warning: type defaults to ‘int’ in declaration of ‘sigset_t’
deps/uv/src/unix/pthread-fixes.c:39: error: expected ‘;’, ‘,’ or ‘)’ before ‘’ token
make: *
* [out/Default/obj.target/libuv/deps/uv/src/unix/pthread-fixes.o] Error 1
[root@iZ23p8bfdl5Z libpomelo2-master]#

wangxy 2014-9-10 17:05 回复

pthread-fixes.c 这个文件里有一行注释,说明了这个问题,你看一下吧,我测试没有问题

bbs3723216 2014-9-10 17:20 回复

@wangxy 弄好了,结果这么报错
[root@iZ23p8bfdl5Z libpomelo2-master]# make
CC(target) out/Default/obj.target/libuv/deps/uv/src/unix/pthread-fixes.o
CC(target) out/Default/obj.target/libuv/deps/uv/src/unix/android-ifaddrs.o
deps/uv/src/unix/android-ifaddrs.c: In function ‘calcAddrLen’:
deps/uv/src/unix/android-ifaddrs.c:270: error: invalid application of ‘sizeof’ to incomplete type ‘struct sockaddr_ll’
deps/uv/src/unix/android-ifaddrs.c:270: warning: implicit declaration of function ‘offsetof’
deps/uv/src/unix/android-ifaddrs.c:270: error: expected expression before ‘struct’
deps/uv/src/unix/android-ifaddrs.c:272: error: expected expression before ‘struct’
deps/uv/src/unix/android-ifaddrs.c: In function ‘makeSockaddr’:
deps/uv/src/unix/android-ifaddrs.c:287: error: dereferencing pointer to incomplete type
deps/uv/src/unix/android-ifaddrs.c:288: error: dereferencing pointer to incomplete type
deps/uv/src/unix/android-ifaddrs.c: In function ‘interpretLink’:
deps/uv/src/unix/android-ifaddrs.c:383: error: dereferencing pointer to incomplete type
deps/uv/src/unix/android-ifaddrs.c:384: error: dereferencing pointer to incomplete type
deps/uv/src/unix/android-ifaddrs.c: In function ‘interpretAddr’:
deps/uv/src/unix/android-ifaddrs.c:565: warning: overflow in implicit constant conversion
make: * [out/Default/obj.target/libuv/deps/uv/src/unix/android-ifaddrs.o] Error 1
[root@iZ23p8bfdl5Z libpomelo2-master]#

bbs3723216 2014-9-10 17:22 回复

@wangxy 可否先把编译的好so发一份到我邮箱?19625845@qq.com,赶着用呢

wangxy 2014-9-10 18:49 回复

@bbs3723216

可以,但是不一定能用

bbs3723216 2014-9-10 19:24 回复

@wangxy 发来~

#22 {2} bbs3723216 2014-9-10 20:55 回复

@wangxy 能否注释下?

public static final int PC_RC_OK = 0;
public static final int PC_RC_ERROR = -1;
public static final int PC_RC_TIMEOUT = -2;
public static final int PC_RC_INVALID_JSON = -3;
public static final int PC_RC_INVALID_ARG = -4;
public static final int PC_RC_NO_TRANS = -5;
public static final int PC_RC_INVALID_THREAD = -6;
public static final int PC_RC_TRANS_ERROR = -7;
public static final int PC_RC_INVALID_ROUTE = -8;
public static final int PC_RC_INVALID_STATE = -9;
public static final int PC_RC_NOT_FOUND = -10;
public static final int PC_RC_RESET = -11;

public static final int PC_ST_NOT_INITED = 0;
public static final int PC_ST_INITED = 1;
public static final int PC_ST_CONNECTING = 2;
public static final int PC_ST_CONNECTED = 3;
public static final int PC_ST_DISCONNECTING = 4;
public static final int PC_ST_UNKNOWN = 5;

public static final int PC_LOG_DEBUG = 0;
public static final int PC_LOG_INFO = 1;
public static final int PC_LOG_WARN = 2;
public static final int PC_LOG_ERROR = 3;
public static final int PC_LOG_DISABLE = 4;

public static final int PC_EV_USER_DEFINED_PUSH = 0;
public static final int PC_EV_CONNECTED = 1;
public static final int PC_EV_CONNECT_ERROR = 2;
public static final int PC_EV_CONNECT_FAILED = 3;
public static final int PC_EV_DISCONNECT = 4;
public static final int PC_EV_KICKED_BY_SERVER = 5;
public static final int PC_EV_UNEXPECTED_DISCONNECT = 6;
public static final int PC_EV_PROTO_ERROR = 7;

public static final int PC_EV_INVALID_HANDLER_ID = -1;

public static final int PC_WITHOUT_TIMEOUT = -1;
wangxy 2014-9-10 21:21 回复

近期会整理出来一个文档的。

大致说一下吧,PC_RC_* 为函数的返回错误码或者回调的状态码

  • PC_ST_* 是client的状态,也即是 pc_client_state()的返回值

  • PC_LOG_* 为日志级别,在调用lib_init的时候传入,控制日志输出的,

  • PC_EV_* 为client的事件,看字面意思就知道了。

  • 有几个辅助函数 evToStr, rcToStr等,可以把数字转成可读的字符串。

  • addEventHandler成功的时候,会返回一个整数值作为handler id, 如果失败则返回PC_EV_INVALID_HANDLER_ID. 返回的这个整数值,可以通过rmHandler调用传入,从而移除EventHandler。

  • PC_WITHOUT_TIMEOUT, 是当你使用 pc_request_with_timeout等调用时,将timeout值设置为此特殊值,那么将永远不会过期,同时还可以用于配置 conn_timeout等。

bbs3723216 2014-9-11 11:07 回复

@wangxy 之前说的编译问题还是要指导处理下

#23 {15} RobetZyarde 2014-9-12 21:32 回复

QT VS2013 使用 -Dno_tls_support=true编译的库

结果运行init时崩溃

wangxy 2014-9-12 23:54 回复

应该是gyp配置文件有问题,有些vs的参数没有调好,有待于修正

bbs3723216 2014-9-13 12:49 回复

@wangxy src/pc_trans.c:111: pc__trans_fire_event: assertion "client->state == PC_ST_CONNECTING" failed 2G网络出现这个问题

RobetZyarde 2014-9-13 16:17 回复

@wangxy 谢谢 菜鸟只能等修正了

wangxy 2014-9-13 17:01 回复

@RobetZyarde 你说的崩溃问题,我这里看了一下,是由于strftime在vs的实现中不支持 %x %T, 目前这个已经改掉了,改成了%c

wangxy 2014-9-13 17:04 回复

@RobetZyarde 这个111行assert fail,难道你是掉用了disconnect后才出现的吗?这个地方实现好像有bug

bbs3723216 2014-9-13 17:10 回复

@wangxy
有BUG。我现在是安卓上用,应该是检测CLIENT的状态的时候吧,马上修复下好吗?赶着交差呢 谢谢~

RobetZyarde 2014-9-14 16:27 回复

@wangxy 谢谢 我再试试

RobetZyarde 2014-9-14 17:15 回复

@wangxy [2014-09-14 17:12:52][INFO] pc_trans_fire_event - fire event: PC_EV_CONNECT_ERROR, arg1: UV Conn Error, arg2:
[2014-09-14 17:12:52][ERROR] tcp__conn_async_cb - uv tcp connect error: invalid argument, will reconn

github上最新的 pomelo 1.1.0

wangxy 2014-9-14 18:42 回复

@RobetZyarde 这个错误是uv_connect报的错误,检查一下你传的参数

bbs3723216 2014-9-15 11:45 回复

@wangxy 我问的问题怎么没给我解答呢

wangxy 2014-9-15 13:31 回复

@bbs3723216 你报的哪个bug

RobetZyarde 2014-9-15 19:55 回复

@wangxy 我放在QT里的

client = (pc_client_t*)malloc(pc_client_size());
pc_client_config_t config = PC_CLIENT_CONFIG_DEFAULT;
pc_lib_init(NULL, NULL, NULL, NULL);
pc_client_init(client,(void*)0x11,&config);
pc_client_connect(client, &quot;127.0.0.1&quot;, 3010, NULL);

= = 就这么多了.. 那个(void*)0x11不太理解

wangxy 2014-9-15 23:06 回复

@RobetZyarde 那个仅仅是个示例,没有啥意义的,不需要的话,直接传NULL,相当于可以让client额外地挂一个其他的指针,可以通过pc_client_ex_data访问

wangxy 2014-10-10 17:30 回复

@RobetZyarde 抱歉,您报的这个bug,今天在windows下试着重新了,目前已经修复了,最新版本 v0.1.2, 谢谢您的关注!

edisonxp 2016-2-3 06:47 回复

@bbs3723216 搞好了没啊?我这里又报 UV Conn Error错误了。。崩溃。。。

#24 {7} bbs3723216 2014-9-15 14:13 回复

@wangxy src/pc_trans.c:111: pc__trans_fire_event: assertion "client->state == PC_ST_CONNECTING" failed

wangxy 2014-9-15 14:15 回复

是不是调用了disconnect时出现的

wangxy 2014-9-15 14:16 回复

尽量一些bug还是提到issue里面吧,那样会好一点

bbs3723216 2014-9-15 14:20 回复

@wangxy 好的没问题~貌似是disconnect

wangxy 2014-9-15 14:24 回复

@bbs3723216 最新的已经修复了

bbs3723216 2014-9-15 16:22 回复

@wangxy
安卓编译Bug
CC(target) out/Default/obj.target/libuv/deps/uv/src/unix/android-ifaddrs.o
deps/uv/src/unix/android-ifaddrs.c: In function ‘calcAddrLen’:
deps/uv/src/unix/android-ifaddrs.c:270:35: error: invalid application of ‘sizeof’ to incomplete type ‘struct sockaddr_ll’
deps/uv/src/unix/android-ifaddrs.c:270:42: warning: implicit declaration of function ‘offsetof’ [-Wimplicit-function-declaration]
deps/uv/src/unix/android-ifaddrs.c:270:65: error: expected expression before ‘struct’
deps/uv/src/unix/android-ifaddrs.c:272:62: error: expected expression before ‘struct’
deps/uv/src/unix/android-ifaddrs.c: In function ‘makeSockaddr’:
deps/uv/src/unix/android-ifaddrs.c:287:49: error: dereferencing pointer to incomplete type
deps/uv/src/unix/android-ifaddrs.c:288:42: error: dereferencing pointer to incomplete type
deps/uv/src/unix/android-ifaddrs.c: In function ‘interpretLink’:
deps/uv/src/unix/android-ifaddrs.c:383:47: error: dereferencing pointer to incomplete type
deps/uv/src/unix/android-ifaddrs.c:384:47: error: dereferencing pointer to incomplete type
deps/uv/src/unix/android-ifaddrs.c: In function ‘interpretAddr’:
deps/uv/src/unix/android-ifaddrs.c:565:13: warning: overflow in implicit constant conversion [-Woverflow]
deps/uv/src/unix/android-ifaddrs.c: In function ‘calcAddrLen’:
deps/uv/src/unix/android-ifaddrs.c:274:1: warning: control reaches end of non-void function [-Wreturn-type]
make: * [out/Default/obj.target/libuv/deps/uv/src/unix/android-ifaddrs.o] Error 1
root@iZ23p8bfdl5Z:/usr/local/src/libpomelo2-master#

edisonxp 2016-2-3 06:48 回复

@wangxy 搞好了没啊?我这里又报 UV Conn Error错误了。。崩溃。。。刚编译好的libpomelo2. 这个东西真是巨坑啊。。能不能搞规范点。。。。

#25 bbs3723216 2014-9-16 09:37 回复

@wangxy @wangxy @wangxy 在吗?

#26 {10} bbs3723216 2014-9-16 20:27 回复

@wangxy @wangxy @wangxy
设置了NDK_PATH,也按照步骤执行SH和MAKE了,提示如下.找不到NDK的JNI。。
In file included from java/com_netease_pomelo_Client.c:10:0:
java/com_netease_pomelo_Client.h:2:17: fatal error: jni.h: No such file or directory
compilation terminated.
而我自己拷贝了一个JNI进去编译出来的却是X86平台的

wangxy 2014-9-16 20:49 回复

在执行android-toolchain.sh的时候,将你ndk的路径作为参数传入,不用手动设置环境变量,难道我没说明白???

bbs3723216 2014-9-16 20:51 回复

@wangxy 不是啊 我就是传参数进去的,还是编译不了·

bbs3723216 2014-9-16 20:51 回复

@wangxy

./android-toolchain.sh /usr/ndk/android-ndk-r10 && ./android-gen.sh && make

wangxy 2014-9-21 21:01 回复

@bbs3723216 抱歉这么晚才回复

我不知道你的具体情况,建议你不要用&&, 先命令一个一个地在同一个terminal里执行吧,执行完 android-toochain.sh <ndk-dir>,如果不出错的话,在当前目录下会有一个android-toolchain子目录,这个子目录里会有交叉编译所需的所有头文件以及库文件,可执行文件等,同时还会设置一个环境变量ANDROID_TOOLCHAIN_DIR,

然后执行android-gen.sh 的时候,会将$ANDROID_TOOLCHAIN_DIR/bin加到PATH, 同时配置$CC,$AR等,然后调用gyp,如果这一步成功的话,会生成一个makefile

然后直接make就好了,需要在同一个teminal下,不然环境变量的设置可能会丢失

需要确认一下在哪一步出的问题

bbs3723216 2014-9-22 12:16 回复

@wangxy 以上我都已确认,也是在同一个终端里执行的

bbs3723216 2014-9-22 12:39 回复

@wangxy 我发现问题了,你们的SH脚本环境设置会丢失

bbs3723216 2014-9-22 12:40 回复

@wangxy 结果AR等我手工设置的包括PATH这样就好了

wangxy 2014-9-22 13:02 回复

@bbs3723216 那就好

vmespace 2014-9-29 16:29 回复

@bbs3723216 请教下,你手工设置的路径都有哪些,我设置了ANDROID_TOOLCHAIN_DIR和$ANDROID_TOOLCHAIN_DIR/bin加到PATH,结果还是不行

vmespace 2014-9-29 18:43 回复

@bbs3723216 @bbs3723216 @bbs3723216 @bbs3723216 @bbs3723216 求指点啊,libpomelo,a可以编译出来,libjpomelo,a不行,一直说找不到jni.h文件

#27 {1} juno5460 2014-9-17 10:47 回复

请问,如何可以编译出安卓的so动态链接库?能否有个教程?

wangxy 2014-9-21 21:02 回复

@juno5460 这个帖子前面的回复中有一个简单的说明,其实NDK的交叉编译并不复杂,都类似的

#29 {1} wangdy 2014-9-19 23:28 回复

pc_mutex.h 里 PTHREAD_MUTEX_RECURSIVE_NP 在xcode里没有定义,经人提示改成 PTHREAD_MUTEX_RECURSIVE 才好

wangxy 2014-9-21 21:03 回复

@wangdy 这个地方是bug,需要用一个宏进行判断的,带NP的仅仅适用于linux,感谢指出!

#30 {11} bbs3723216 2014-9-22 13:04 回复

@wangxy
又出现BUG
src/tr/uv/tr_uv_tls_aux.c:105: tls__write_to_bio: assertion "tt->state == TR_UV_TCP_CONNECTING || tt->state == TR_UV_TCP_HANDSHAKEING || tt->state == TR_UV_TCP_DONE" failed

wangxy 2014-9-22 13:08 回复

报出来的这个assert是ok的,应该是其他地方处理的有问题,能给出test case吗,或者大致描述一下,如何重现

bbs3723216 2014-9-22 16:21 回复

@wangxy 因为设计了断线重连机制,在EVENT检测连接状态,状态不对就重连,然后2G网络不稳定的时候连接会一直被创建。导致服务端多空连接客户端也报错

wangxy 2014-9-22 16:48 回复

@bbs3723216 connect只需要调用一次,断线重连底层已经做了,不用高层做的,高层只需要有对应事件抛上来的时候处理就好了

bbs3723216 2014-9-22 17:54 回复

@wangxy 我的业务逻辑是有网关的,假如在网关断开了,我怎么知道是操作网关的QUERY还是操作下一步CONNECTOR的ENTEY呢?

wangxy 2014-9-22 19:46 回复

@bbs3723216 如果你确实要断开的话,需要手动调用disconnect,或者disable掉auto conn retry

bbs3723216 2014-9-22 19:47 回复

@wangxy 我现在的问题是,用户假如连接意外断开,我必须要知道他从哪一步断开,我才能做相应的操作访问对应的路由或者是重新访问其他的服务器进行状态转移到新的连接

wangxy 2014-9-23 09:38 回复

@bbs3723216 TCP是无法知道连接意外断开的,目前的断线检测是通过心跳超时来实现的。

bbs3723216 2014-9-23 12:27 回复

@wangxy 我发现如果在2G网络下,由于不稳定会导致多次重连的情况。

wangxy 2014-9-23 17:41 回复

@bbs3723216 不好意思,我这里没有在2G环境,没法测试这类情况,希望能帮忙定位bug, 一起提高健壮性,服务大家,多谢!

bbs3723216 2014-9-23 19:56 回复

@wangxy 对了麻烦指导下C代码中的连接的流程调用哪些方法,TLS是如何取证书的。稍后我会把我们近期发现的BUG整理一份发到issues

wangxy 2014-9-24 13:18 回复

@bbs3723216

  • 目前的java绑定的的tls,仅仅使用了加密而已,关于证书验证相关的,没有绑出来,不过,如果在调用 libInit()的时候传入了caFile和caPath参数的话,将会使用这个ca对服务端的证书进行验证

  • 如果直接使用C代码的话,就可以任意操作tls相关了,如果使用的transport是TLS的话,可以通过如下方式获得到SSL*:

void* data = pc_client_trans_data(client);
void** internal_data = (void**)data;
void* s = internal_data[1];
SSL* tls = (SSL*) s;

当调用过pc_client_init后,可以通过上面的方式,获取到内部的SSL,然后就可以使用openssl的相关调用了,比如服务端开启了客户端证书验证的话,这里可以配置客户端证书,私钥等。

  • 关于连接流程,由于是基于libuv的,使用的bio pair的方式,与tls相关的所有代码都在 tr_uv_tls*.h/c中,有很多方法都是从tcp的实现中直接继承的,部分重写
#31 {7} wangxy 2014-9-30 11:11 回复

@vmespace @bbs3723216 关于android的编译又进行了一些简化,目前最新版0.1.1的提供了一个android-compile.sh脚本,使用方法为:

./android-compile.sh &lt;NDK_ROOT&gt; [ssl]

<NDK_ROOT> 为ndk的根目录,ndk版本尽可能高点,测试使用的是r10版本
ssl参数为可选,如果需要ssl支持,就增加这个参数,示例如下:

需要ssl支持:

./android-compile.sh /opt/android-ndk-r10 ssl
make

不需要ssl支持:

./android-compile.sh /opt/android-ndk-r10 
make
vmespace 2014-10-3 17:40 回复

@wangxy,不错,啥时候再增加个不需要libuv的选项,国庆快乐。

vmespace 2014-10-8 12:37 回复

@wangxy@wangxy@wangxy@wangxy,在跑测试例子时,返回错误为Read Error Or Close,错误码显示为PC_EV_UNEXPECTED_DISCONNECT,这个哪里看文档,这个错误又是怎么引起的。

wangxy 2014-10-8 12:54 回复

@vmespace 这个错误的原因是read调用返回了-1,可能是由于连接被reset或者连接被断开

vmespace 2014-10-8 14:11 回复

我服务端是chat的服务器,Chat源码下载与安装,已经跑起来了,我在测试例子里连接时是这样写的:

int handler_id = c.addEventHandler(new Client.EventHandler() {
    public void handle(int ev_type, String arg1, String arg2) {
        System.out.println(&quot;get push message: &quot; + arg1 + arg2);
        System.out.println(&quot;ev_type: &quot; + Client.evToStr(ev_type));
    }
});

int cerr =  c.connect(&quot;192.168.235.123&quot;, 3014);
Log.v(&quot;wangc&quot;, cerr + &quot;&quot;);

192.168.235.123是我服务器IP,连接完后,服务器的LOG为:
[gate-server-1] getSession session is created with session id: 60
close the connection with invalid head message, the remote ip is 192.168.235.194 && port is 37206 && message is [22,3,0,0,135,1,0,0,131,3,0,168,129,76,191,176,165,57,97,244,1,108,217,116,36,77,131,215,242,169,243,136,131,63,251,81,163,86,164,229,196,68,48,0,0,92,192,20,192,10,0,57,0,56,0,136,0,135,192,15,192,5,0,53,0,132,192,19,192,9,0,51,0,50,0,154,0,153,0,69,0,68,192,14,192,4,0,47,0,150,0,65,0,7,192,17,192,7,192,12,192,2,0,5,0,4,192,18,192,8,0,22,0,19,192,13,192,3,0,10,0,21,0,18,0,9,0,20,0,17,0,8,0,6,0,3,0,255,1,0]
session on [gate-server-1] is closed with session id: 60

为什么说头不对,这个例子需要怎么改,才能连上chat服务器呢?

vmespace 2014-10-8 16:53 回复

@vmespace @wangxy,已经调通,不过下载最新能够去掉ssl的,System.loadLibrary("jpomelo")失败。用之前的可以了,接收消息,发送消息,跟聊天服务器对接已经OK。

wangxy 2014-10-8 17:38 回复

@vmespace 这个加载失败的原因跟更新应该关系不大,估计是有地方没处理好,多谢关注

vmespace 2014-10-8 17:47 回复

@wangxy 那就不清楚,这两个版本之间有什么区别了,目前在用之前的放假前的版本

#32 vmespace 2014-9-30 16:30 回复

对于libpomelo编译android版本的步骤,新鲜出炉,完美生成libjpomelo以及如何使用eclipse搭建测试工程。libpomelo2在linux下编译android动态库libjpomelo

#33 wangxy 2014-9-30 17:01 回复

赞~

#34 {7} bbs3723216 2014-10-5 16:25 回复

@wangxy 2G网络环境下直接报线程退出了。。。。然后APP就崩溃了,安卓

wangxy 2014-10-7 10:40 回复

请使用最新的,一直在修bug

bbs3723216 2014-10-7 11:07 回复

@wangxy 是最新的了·

wangxy 2014-10-7 18:31 回复

@bbs3723216 希望能有更多的信息,否则没法定位,把日志级别调到debug吧,弄点debug日志看看

bbs3723216 2014-10-8 10:26 回复

@wangxy 在哪个文件设置日志级别~

wangxy 2014-10-8 12:53 回复

@bbs3723216 libInit调用的第一个参数传入Client.PC_LOG_DEBUG, 抓点日志看看

bbs3723216 2014-10-8 15:41 回复

@wangxy
error:

src/pc_trans.c:111: pc__trans_fire_event: assertion "client->state == PC_ST_CONNECTING || client->state == PC_ST_DISCONNECTING" failed

wangxy 2014-10-8 16:02 回复

@bbs3723216 怎样操作才能产生,在这个地方打个日志,看看client->state的值?

#35 {1} nihaoa 2014-10-9 15:43 回复

请问mac 64位 使用的是ndk 10 生成的makeFile是一个pomelo.xcodeproj(x-code工程)吗?运行x-code工程的时候会缺少一些头文件,在User Header Search Paths 增加ndk 10 的usr/include的路径后OS X 10.9 的usr/include/i386的_types.h 的 typedef long long __int64_t;
typedef unsigned long long __uint64_t;又会报错,我的是64位的机子啊。到这里卡住了,不知道怎么解决了。求帮主。如果不添加ndk 10 的usr/include的路径可以生成libpomelo2.a的静态库,但是没有libjpomelo.so动态库。

wangxy 2014-10-9 15:52 回复

抱歉,没有相应的环境,不清楚具体情况

如果你以前弄过android其他库的java绑定so生成的话,你可以以同样的方式处理,然后,link一下libpomelo2.a即可

#36 {2} skyblue 2014-10-11 11:14 回复

只等个lua binding ~~ py java都有
游戏用最多的lua没有 这不科学........

wangxy 2014-10-11 11:56 回复

@skyblue lua binding 希望有人贡献一个,还有csharp binding,主要是unity3d的,binding出来一个native plugin,我们希望有人能贡献,欢迎!

magichere 2017-8-25 11:49 回复

Unity3D C# 需要啊

#37 {3} showland 2014-10-15 17:22 回复

libpomelo2 不带注释么?
有没有api的说明之类的文档呢?

wangxy 2014-10-15 17:26 回复

@showland

代码实现的关键地方都是有注释的,api说明文档没有写,但是api比较简单,而且有源码

showland 2014-10-15 19:15 回复

@wangxy 例如

PC_EXPORT int pc_client_init(pc_client_t* client, void* ex_data, const pc_client_config_t* config);
PC_EXPORT int pc_client_connect(pc_client_t* client, const char* host, int port, const char* handshake_opts);

这些都没加注释啊,各个参数代表什么意思呢?求教

wangxy 2014-10-15 22:07 回复

@showland

最近有空的时候,整理一下api吧

#38 guolianghu 2014-10-15 21:43 回复

支持~ 另求unity版本。。

#39 {1} aaronc 2014-10-24 11:30 回复

@wangxy 2G网络下极其不稳定,会经常自己断开然后不断重连,多几次这样的行为就崩溃了

wangxy 2014-10-24 11:39 回复

@aaronc 是的,目前没有在2G环境下跑过太多测试,我们主要是在稳定的网络中用

2G网络中应该是触发了什么异常的bug,还有就是2G网络下,可以把心跳时间调大一点

如果崩溃的话,有崩溃时的堆栈最好了,希望大家一起来改善

#40 showland 2014-11-19 15:18 回复

这个编译起来好难啊,
想在xcode下编译进行ios开发,弄了两天了,愣是没搞定,有没有比较详细的说明啊……

#41 {21} zlstt 2014-12-18 00:59 回复

iOS怎么编?
执行了这个
gyp --depth=. pomelo.gyp -Duse_sys_openssl=false -Dpomelo_library=static_library -Dtarget_arch=x64

然后不知道做什么了。。。。。。

wangxy 2014-12-18 17:28 回复

@zlstt 在ios中,目前的openssl编译有点小问题,需要对openssl的代码做少量修改,现在没时间搞,不需要的话,直接把openssl支持先disable掉。

当disable掉openssl的时候,target_arch 是可以省略掉的

gyp --depth=. pomelo.gyp -Dno_tls_support=true -Dpomelo_library=static_library

然后会生成xcode的工程文件,是mac的,用xcode打开,然后手动地修改下工程配置,包括支持的平台,SDK类型等等

然后编译,就有对应的.a文件了,test里的几个项目可能会报连接错误,因为.a文件的路径没有配,忽略。

具体使用的时候,只要要一个头文件pomelo.h就ok了,如果需要jansson,自己再加jansson的头文件

zlstt 2014-12-19 16:35 回复

@wangxy 哇,原来这么简单,多谢了

zlstt 2014-12-19 16:42 回复

@wangxy 顺便问一句,这个兼容pomelo服务器以前的版本吗? 我线上的版本是0.7.6

wangxy 2014-12-19 18:37 回复

@zlstt 没做兼容,协议上有微调,最低版本要求配合服务器的1.1.0

angelababa 2015-3-24 11:19 回复

@wangxy 你好,我的项目中需要用到tls。请问有办法解决么?

wangxy 2015-3-24 11:26 回复

@angelababa

有什么问题吗,libpomelo2的tls是可以直接用的

angelababa 2015-3-24 11:27 回复

@wangxy ios中好像openssl不能用?

wangxy 2015-3-24 13:41 回复

@angelababa

你试试能不能单独编译一下openssl,如果能单独编译openssl供ios用,就ok了。

我以前编译的时候,有点小问题,没有细跟。

mac下编译没问题。

wangxy 2015-3-24 13:44 回复

@angelababa

我看好像也能搞到别人编译好供ios用的libcrypto.a跟libssl.a

angelababa 2015-3-24 13:48 回复

@wangxy 对。编译mac的没问题。编译iOS的编译失败。可以把libcrypto.a跟libssl.a发我试试么:271460023@qq.com

wangxy 2015-3-24 14:15 回复

@angelababa

我这里没有,github上有人托管的,你搜一下吧,网上很多的

angelababa 2015-3-24 14:56 回复

@wangxy 恩,我下载了,libcrypto.a跟libssl.a如何在pomelo中使用?

angelababa 2015-3-24 15:47 回复

@wangxy 我测试的时候 pc_client_init(client, NULL, &config); 如果第三个参数设置为【&config】就报错:[ERROR] pc_client_init - no registered transport plugin found, transport plugin: 1
Assertion failed: (!ret), function pc_mutex_lock, file src/pc_mutex.h, line 68.
如果设置为【NULL】则发送给服务器的没加密

wangxy 2015-3-24 15:56 回复

@angelababa 你确定已经把openssl编译进去了?

wangxy 2015-3-24 15:58 回复

@angelababa

编译参数那里,设置一下Duse_sys_openssl=true, 也就是告诉编译器,编译pomelo的时候,不自己编译openssl,然后手动把-lcrypto以及-lssl加到项目依赖里面

angelababa 2015-3-24 16:07 回复

@wangxy 我添加了ibcrypto.a和libssl.a,并且导入了openssl的include。编译还是报错?

wangxy 2015-3-24 16:16 回复

@angelababa

再手动修改一下宏定义吧,有一个宏 PC_NO_TLS_TRANS,你看一下,这个宏是不是打开了,把这个宏删掉

angelababa 2015-3-24 16:23 回复

@wangxy pomelo.h中没有定义这个宏。

wangxy 2015-3-24 16:27 回复

@angelababa

编译选项中定义的,直接从xcode的预处理选项里去掉

angelababa 2015-3-25 10:43 回复

@wangxy PC_TEST_ASSERT是用来干嘛的,在项目中需要定义这个吗

wangxy 2015-3-25 11:19 回复

@angelababa

不用管,就是对c的assert做的一个包装,用不到的

#42 {10} poikl369 2014-12-31 07:27 回复

liuyundeMacBook-Pro:libpomelo2-master liuyun$ make
CC(target) out/Default/obj.target/jansson/deps/jansson/src/dump.o
make: arm-linux-androideabi-gcc: No such file or directory
make: * [out/Default/obj.target/jansson/deps/jansson/src/dump.o] Error 1

这个事什么原因啊

wangxy 2014-12-31 09:45 回复

交叉编译的时候,没有交叉编译环境
#20

poikl369 2014-12-31 14:42 回复

@wangxy 我看了网上的教程 事按照步骤来的 在文件夹下面对应的文件也生成了

poikl369 2014-12-31 14:54 回复

@wangxy ndk我也是安装好了的

poikl369 2014-12-31 15:05 回复

@wangxy android-toolchain 生成了这个文件夹 文件夹里面也有arm-linux-androideabi-gcc这个文件

wangxy 2014-12-31 17:32 回复

@poikl369 Mac下你可以参照上面那个帖子中的,使用Jennal提供的Android.mk #20

poikl369 2014-12-31 17:49 回复

@wangxy ok 我试一试 但是我这个问题在linux下和mac下都出现了

poikl369 2014-12-31 17:52 回复

@wangxy Android.mk 如何编译啊

poikl369 2014-12-31 18:08 回复

@wangxy deps/uv/src/unix/linux-core.c:33:10: fatal error: 'sys/prctl.h' file not found

include <sys/prctl.h>

^
1 error generated.
make: * [out/Default/obj.target/libuv/deps/uv/src/unix/linux-core.o] Error 1

gyp也报错了

wangxy 2014-12-31 18:39 回复

@poikl369 看这里吧http://nodejs.netease.com/topic/542a6f3a22834310624fadcc, 论坛一个哥们总结的
现在没时间搞把编译过程弄得更友好, 不好意思

poikl369 2014-12-31 19:09 回复

@wangxy 他这个我也试过了 就出现了 第一个那个错误

#43 {1} Frank 2015-3-5 11:25 回复

默认的heartbeat的时间是多少,或者怎么配置啊?要跟服务端保持一致

wangxy 2015-3-5 12:32 回复

@Frank hearbeat是服务端配置的,在握手的时候传到客户端的

#44 kin2141539 2015-4-30 16:51 回复

hi,问下,现在unity的有了吗

#45 kin2141539 2015-5-11 19:06 回复

说好的文档有了吗。。

#46 awwuwei 2015-7-13 22:16 回复

为什么我会有两个报错:
error: undefined reference to 'getifaddrs'
error: undefined reference to 'freeifaddrs'

#47 {1} awwuwei 2015-7-13 22:19 回复

这两个错误是在 libpomelo2.a 和 libjpomelo.so 成功生成之后,test-tr_dummy 链接库时出现的

wangxy 2015-7-14 19:51 回复

平台?版本?

#48 awwuwei 2015-7-15 01:14 回复

<1>编译环境
----版本:libpomelo2.0.3.5
----系统:ubuntu12.04
----编译工具
--------gcc version 4.6.4 (Ubuntu/Linaro 4.6.4-1ubuntu1~12.04)
--------android-ndk-r9d

<2>编译设置
----android-toolchain.sh
export ANDROID_TOOLCHAIN_DIR=/home/cz/Desktop/work_disk/tools/libpomelo2.0.3.5/android-toolchain
mkdir -p $ANDROID_TOOLCHAIN_DIR
$1/build/tools/make-standalone-toolchain.sh \
--toolchain=arm-linux-androideabi-4.8 \
--arch=arm \
--install-dir=$ANDROID_TOOLCHAIN_DIR \
--platform=android-9

----android-gen.sh:
export ANDROID_TOOLCHAIN_DIR=/home/cz/Desktop/work_disk/tools/libpomelo2.0.3.5/android-toolchain
export PATH=$ANDROID_TOOLCHAIN_DIR/bin:$PATH
export AR=arm-linux-androideabi-ar
export CC=arm-linux-androideabi-gcc
export CXX=arm-linux-androideabi-g++
export LINK=arm-linux-androideabi-g++
export PLATFORM=android

./build/gyp/gyp --depth=. -Dtarget_arch=arm -DOS=android -Dpomelo_library=static_library -Duse_sys_openssl=false -Dbuild_jpomelo=true -Dno_tls_support=true -Dno_uv_support=false pomelo.gyp --format=make

<3>错误信息:
----CC(target) out/Default/obj.target/tr_dummy/test/test-tr_dummy.o
----LINK(target) out/Default/tr_dummy
--------deps/uv/src/unix/linux-core.c:770: error: undefined reference to 'getifaddrs'
--------deps/uv/src/unix/linux-core.c:848: error: undefined reference to 'freeifaddrs'

<4>临时解决方案
----android-gen.sh:
./build/gyp/gyp --depth=. -Dtarget_arch=arm -DOS=android -Dpomelo_library=static_library -Duse_sys_openssl=false -Dbuild_jpomelo=true -Dno_tls_support=true -Dno_uv_support=true pomelo.gyp --format=make
* -Dno_uv_support=true 即可,但这不就屏蔽掉了uv吗?

#49 {2} awwuwei 2015-7-15 06:00 回复

对了,libuv是不是不支持64位系统? 我在ubuntu12.04 64位下编译 libpomelo2, 如果要使用 libuv (通过设置 -Dno_uv_support=false),那么,libpomelo2 库是可以编译通过,但是 ,测试项目(比如 tr_dummy,tr_tcp,tr_tls)链接 libuv 时,始终会报错:
deps/uv/src/unix/linux-core.c:770: error: undefined reference to 'getifaddrs'
deps/uv/src/unix/linux-core.c:848: error: undefined reference to 'freeifaddrs'

最悲剧的是,我的执行程序必须是64位的。这就导致了无论在linux下还是在windows下,libuv 链接都会出问题。 现在 libpomelo2 有没有不使用 libuv 的解决方案?

wangxy 2015-7-15 09:47 回复

64位也是没问题的,改一下编译器设置就好了。

你报的这个连接错误是由于有一个文件没有被编译造成的

deps/uv/src/unix/android-ifaddrs.c 这个文件,你可以手动修改一下makefile,把这个文件的编译加上就好了。

awwuwei 2015-7-15 21:14 回复

@wangxy 具体修改UV中的哪个文件呢?

#50 awwuwei 2015-7-16 12:49 回复

这种情况应该是那几个测试项目没有包含 android-ifaddrs.h 的原因造成的吧?

.android-ifaddrs的头文件所在位置:
/deps/uv/include/android-ifaddrs.h
.o文件:
out:
/out/Default/obj.target/libuv/deps/uv/src/unix/getaddrinfo.o
.mk文件:
tr_tls.target.mk,tr_tcp.target.mk,tr_dummy.target.mk中:

INCS_Default := ...&#92;
            -Ideps/uv/include &#92;
            ...

.deps/uv/Android.mk

LOCAL_SRC_FILES := ...
src/unix/getaddrinfo.c \
...
.deps/uv/libuv.target.mk
OBJS := ...
$(obj).target/$(TARGET)/deps/uv/src/unix/getaddrinfo.o \
...
make 结果仍然是:
CC(target) out/Default/obj.target/tr_dummy/test/test-tr_dummy.o
LINK(target) out/Default/tr_dummy
deps/uv/src/unix/linux-core.c:770: error: undefined reference to 'getifaddrs'
deps/uv/src/unix/linux-core.c:848: error: undefined reference to 'freeifaddrs'

#51 {6} awwuwei 2015-7-16 14:13 回复

好了,搞定了:
在deps/uv/uv.gyp里, 'OS=="android"' 项中添加 'src/unix/android-ifaddrs.c', 就OK
[ 'OS=="android"', {
'sources': [
'src/unix/linux-core.c',
'src/unix/linux-inotify.c',
'src/unix/linux-syscalls.c',
'src/unix/linux-syscalls.h',
'src/unix/pthread-fixes.c',
'src/unix/android-ifaddrs.c',
],
'link_settings': {
'libraries': [ '-ldl' ],
},
}],

angrycans 2015-7-28 15:22 回复

编译通过了 但是for android 的libjpomelo 不能使用 不能连接上chat-server
有人能连上吗 最新的版本

kezhaoyuan 2015-8-4 17:12 回复

@angrycans 你好,我现在也是因为同样的问题编译出libjpomelo.so不能使用。请问你最终解决了问题吗?

kezhaoyuan 2015-8-5 11:58 回复

@awwuwei 你好,我按照你的说法,在deps/uv/uv.gyp里, 'OS=="android"' 项中添加 'src/unix/android-ifaddrs.c 。但还是出现那个错误:
SOLINK(target) out/Default/obj.target/libjpomelo.so
COPY out/Default/lib.target/libjpomelo.so
CC(target) out/Default/obj.target/tr_dummy/test/test-tr_dummy.o
LINK(target) out/Default/tr_dummy
deps/uv/src/unix/linux-core.c:770: error: undefined reference to 'getifaddrs'
deps/uv/src/unix/linux-core.c:848: error: undefined reference to 'freeifaddrs'
collect2: error: ld returned 1 exit status
make: * [out/Default/tr_dummy] Error 1
请问你有解决方法吗?
请指点一下,谢谢

awwuwei 2015-8-5 23:39 回复

@kezhaoyuan 你仔细点看看是不是哪儿改错了,我就是这样改了就可以编译通过了。

kezhaoyuan 2015-8-6 09:12 回复

@awwuwei 我最后是编译通过了,但是是把'src/unix/android-ifaddrs.c', 放在第一位,'src/unix/linux-core.c',的前面才通过的。我估计是先后依赖的问题。
可惜的是,把编译通过的so文件,放到android项目里面,连不上服务器,出现PC_EV_CONNECT_ERROR的错误。
请问你编译出来的so文件可用吗?
能不能发我一份:345718995@qq.com
谢谢。

losingle 2016-12-3 03:25 回复

@kezhaoyuan 你是不是用ndk-build编译的?

#52 talentjxw 2015-8-24 15:50 回复

pc_client_config_t config = PC_CLIENT_CONFIG_DEFAULT;
config.transport_name = PC_TR_NAME_UV_TLS;
config.local_storage_cb = local_storage_cb;
pc_client_init(m_client,(void*)0x11,&config);

void cc_pomelo_on_request_cb(pc_request_t request, int rc, const char resp)
然后发消息,回调函数中resp=null,rc = -11,请问是什么原因

#53 {2} talentjxw 2015-8-27 15:26 回复

测试消息,返回-11,并有如下错误,请问这是什么原因
tcp__on_tcp_read_cb - read from tcp error: end of file,will reconn

wangxy 2015-8-28 11:32 回复

@talentjxw 连接被对端关掉了,如果网络没问题的话,请确认一下服务端是否用的是hybridconnector,以及 是否一端使用的是tls,另一端没有使用

talentjxw 2015-8-31 14:22 回复

@wangxy 谢谢指点,已经可以通信

#54 {4} zjhangtian 2015-8-30 11:19 回复

请问,如果我想在Unity里面使用libpomelo2,该如何编译呢?

wangxy 2015-8-31 09:21 回复

有一个哥们贡献了C# 绑定,在文件夹 cs 目录下,具体的使用,你可以联系 C# 绑定的作者,谢谢关注.

zjhangtian 2015-8-31 22:54 回复

@wangxy 主要是不知道怎么编译,是不是android/ios要分别编译?因为目前用的是pomelo-unityclient那个,我看了源码,那个是纯C#写的,而libpomelo系列,貌似是要先按照平台编译,然后再2次开发绑定语言?

wangxy 2015-9-1 10:01 回复

@zjhangtian 硬件架构都不同,肯定要分别编译了,因为是native代码。绑定已经有哥们贡献了,可以参考一下 cs 目录下的那个例子。 原来的那个pomelo-unityclient 跟libpomelo也没有半毛钱关系,协议层面 一直都没有过很大的调整,也都是兼容的。libpomelo本身有些fatal bug,几乎不可修复,所以才重写.

zjhangtian 2015-9-1 10:03 回复

@wangxy 也就是说,pomelo-unityclient也是可以继续用下去的,与最新版的pomelo server也是兼容的,对吧?
thank you~~

#55 talentjxw 2015-9-9 13:52 回复

@wangxy 请问怎么编ios真机版的lib,我将配置修改成arm64,armv7s,armv7,然后一堆BN_ULONG找不到在bn.h文件下,请问怎么解决。。

#56 {5} talentjxw 2015-9-9 13:52 回复

@wangxy 请问怎么编ios真机版的lib,我将配置修改成arm64,armv7s,armv7,然后一堆BN_ULONG找不到在bn.h文件下,请问怎么解决。。

wangxy 2015-9-9 14:22 回复

@talentjxw 有时间的话,我会改一下。

你可以从网上下一个别人编译好openssl在ios真机上的.a文件,然后加到项目依赖里面就好了,有两个文件,ssl跟crypto,有很多好心人都干了这件事, ;)

talentjxw 2015-9-10 11:29 回复

@wangxy 嗯,我后来重新编了一下,之前生成的libopensll.a变成了libssl.a,和libcryto.a,然后libpomelo2.a,libuv.a,都可以在真机上运行,但是一直返回连接不上,模拟器上是可以正常运行pctrans_fire_event - fire event: PC_EV_CONNECT_ERROR, arg1: Connect Error, arg2:
test:2 get event PC_EV_CONNECT_ERROR, arg1: Connect Error, arg2:
[2015-09-10 11:17:05][INFO] pc
trans_fire_event - fire event: PC_EV_DISCONNECT, arg1: , arg2:
test:4 get event PC_EV_DISCONNECT, arg1: , arg2:
这是报的错误,请问一下是什么原因。谢谢哦

wangxy 2015-9-10 12:53 回复

@talentjxw

需要确定两端是不是都开了tls,或者是不是一端配了,另一端没有配.如果还有问题的话,再报吧。那个java绑定里面,就简单地绑了一下,设置了一个boolean开关. C的话,也需要改一下配置,注意一下transport_name

另外,如果你们的流量不需要加密的话,可以把tls的支持去掉,那样编译时不会编译openssl

再另外, 目前客户端的tls支持,仅仅用来做加密了,默认配置里面没有开启证书校验,如果使用C,api提供了获取SSL*结构的方法,用户可以手动配置证书验证.对于其他的绑定,证书验证这一块都没绑出来.

edisonxp 2016-2-3 02:59 回复

@wangxy 大哥哥。。android libpomelo2我编译了2天,死活编译不过,最后发现是gyp的参数需要修改下: -f make-android.. 这个资料太少。。谁遇到了都坑爹。。

我现在android studio中写jpomelo测试调用。。结果死活连不上服务器,报错: PC_RS_RESEST, null.. 这又是怎么回事??????? 求解答。。直接tcp_reset了。我连哪里都报这个错.

wangxy 2016-2-3 09:50 回复

@edisonxp

你服务端不启动的话,连的肯定是报错的了

tcp方面的问题,抓个包就知道了

#57 {1} talentjxw 2015-9-22 11:26 回复

@wangxy
想用protosbuf发送消息,客户端解析返回错误
pc_body_json_decode - json decode error
请问什么原因,怎么解决~~谢谢先。

wangxy 2015-9-23 14:11 回复

@talentjxw 可能是proto 配置的问题,目前的protobuf实现得非常非主流,你再对一下

#58 {3} alonecat06 2016-12-10 00:38 回复

各位好,我使用libpomelo2开发客户端,发现一个问题。连接成功一段时间后(大概1到2分钟,刚好这段时间内客户端服务器间没有通信)连接会断开,而后又重新自动连接。这是正常的情况还是另有问题?
我下了断点,是tcpon_tcp_read_cb函数调用pc_trans_fire_event,发出PC_EV_UNEXPECTED_DISCONNECT,客户端发起断开连接。堆栈如下
UE4Editor-LibpomeloClient.dll!tcp
on_tcp_read_cb(uv_stream_s * stream, int64 nread, const uv_buf_t * buf) Line 827 C
UE4Editor-LibpomeloClient.dll!tls
on_tcp_read_cb(uv_stream_s * stream, int64 nread, const uv_buf_t * buf) Line 517 C
UE4Editor-LibpomeloClient.dll!uv_process_tcp_read_req(uv_loop_s * loop, uv_tcp_s * handle, uv_req_s * req) Line 1019 C
UE4Editor-LibpomeloClient.dll!uv_process_reqs(uv_loop_s * loop) Line 151 C
UE4Editor-LibpomeloClient.dll!uv_run(uv_loop_s * loop, uv_run_mode mode) Line 344 C
UE4Editor-LibpomeloClient.dll!uv
thread_start(void * arg) Line 145 C
ucrtbase.dll!00007ffd549fcab0() Unknown
kernel32.dll!00007ffd579a8364() Unknown
ntdll.dll!00007ffd57da5e91() Unknown

往前找发现它在uv_process_tcp_read_req函数中调用了tcp__alloc_cb,但“buf->base = tt->tcp_read_buf;”中的tt->tcp_read_buf是乱码,导致handle->read_cb((uv_stream_t*)handle, UV_EOF, &buf);
不知道这是什么意思?
是指我服务器客户端没有时刻通信?但Pomelo自己不是有心跳的么?
还是指服务器客户端,一边ssl一边没有,不配对?我服务器客户端都设置了ssl,而且前面已经成功通信过的,但后面没有一直通信,而且我试过在uv_run中打断点,它也不是一直执行,是直到这个导致断开的那一帧才回调。

那究竟这是不是正常,如果不是正常那该如何解决。希望能够得到一个思路或者方向。谢谢了

wangxy 2016-12-12 11:14 回复

一些排查思路:

  1. 如果会网络ok的情况下,断线重连,是不正常的

  2. 可以看看服务端的connector上,有没有什么报连接异常的日志

  3. 你可以先把ssl关掉,然后看一下走默认的tcp会不会重现,重现的话,直接抓包看一下整个交互流程,就可以看一下这个断线重连是怎么发生的了

  4. tcp_read_buf 乱码不乱码跟UV_EOF没有半毛钱关系,tcp_read_buf只是一段实现分配好的缓冲区,需要的时候,里面才会有合法的数据。UV_EOF,如果客户端没有主动断连操作,则一定是连接被服务端主动断开

  5. 不排除pomelo 服务端的bug,balabala...............

alonecat06 2016-12-14 00:44 回复

@wangxy
谢谢楼主大大的思路。
是连接本机的,应该网络不会有阻塞。
connector上没有链接异常的日志,只有报断开连接,随即一个新的链接接入的日志。
这几天我试试关掉ssl,并且试试用其他客户端连服务器看看是否有自动断开,有结果就继续跟帖。

alonecat06 2016-12-23 17:11 回复

@wangxy
原来是我搞错了,是服务器超时把客户端踢了,不好意思哦。
如果是ssl加密的,服务端没有超时的警告;但如果是没有ssl,就看到了超时的警告。
根据警告查,发现论坛的帖子:http://nodejs.netease.com/topic/5256610b0a516e18511b34e7
最后一个回复是正解,心跳的配置不能高于90秒,之前我直接拿Treasure做服务器,connector的heartbeat为100,所以当我连上服务器后一直不发消息,心跳配置成了100秒,服务器就认为我是空连接把我踢掉了。

回到顶部