netease / libpomelo Goto Github PK
View Code? Open in Web Editor NEW[DEPRECATED] Please Go to https://github.com/NetEase/libpomelo2
License: MIT License
[DEPRECATED] Please Go to https://github.com/NetEase/libpomelo2
License: MIT License
json_dumps内部会调用 jsonp_malloc来分配内存,并把这个内存返回给调用者。
这块内存通常是调用者自己调用free释放。
但是jsonp_malloc是可以通过json_set_alloc_funcs来重新定义的。一旦jsonp_malloc被重新定义,比如使用了内存池,再用free释放这块内存就会出问题了。
目前看了一下在收发消息的时候,jansson内部会频繁调用jsonp_malloc和jsonp_free分配释放内存,所以考虑想用一块预分配好的内存池。所以发现上述问题。
ibuv一直有错误,刚开始更多,引入了ws2_32.lib之后错误少了很多,但还是有四个错误:
1>libuv.lib(getaddrinfo.obj) : error LNK2019: 无法解析的外部符号
__imp__GetAddrInfoW@16,该符号在函数 _getaddrinfo_thread_proc@4 中被引用 1>libuv.lib(getaddrinfo.obj) : error LNK2019: 无法解析的外部符号
__imp__FreeAddrInfoW@4,该符号在函数 _uv_process_getaddrinfo_req 中被引用 1>libuv.lib(util.obj) : error LNK2019: 无法解析的外部符号
_GetAdaptersAddresses@20,该符号在函数 _uv_interface_addresses 中被引用 1>libuv.lib(util.obj) : error LNK2019: 无法解析的外部符号
_GetProcessMemoryInfo@12,该符号在函数 _uv_resident_set_memory 中被引用 1>E:\work\pomelo\multi-platform-cpp\proj.win32\Debug.win32\HelloCpp.exe : fatal error LNK1120: 4 个无法解析的外部命令
关于pomelo的三个项目libpomelo,libuv,jannson都进了解决方案,自己项目的依赖也设置了,在项目属性中依赖库叶把对应三个lib库手动加了进去,之后为了解决libuv错误还加了ws2_32.lib。
环境是windows vs2012 cocos2d-x 2.1.5
在client.c文件中的这个函数:
int pc_client_connect(pc_client_t *client, struct sockaddr_in *addr) {
pc_connect_t *conn_req = pc_connect_req_new(addr);
if(conn_req == NULL) {
fprintf(stderr, "Fail to malloc pc_connect_t.\n");
goto error;
}
if(pc_connect(client, conn_req, NULL, pc__client_connected_cb)) {
fprintf(stderr, "Fail to connect to server.\n");
goto error;
}
// 1. start work thread
// 2. wait connect result
uv_thread_create(&client->worker, pc__worker, client);
// TODO should set a timeout?
pc__cond_wait(client, 0);
pc_connect_req_destroy(conn_req);
if(PC_ST_WORKING != client->state) {
return -1;
}
return 0;
error:
if(conn_req) pc_connect_req_destroy(conn_req);
return -1;
}
看起来uv_thread_create函数创建线程是成功的,worker确实已经被赋值,此时client状态是PC_ST_CONNECTING,在执行pc_cond_wait函数后, 状态就变成PC_ST_CLOSED了,大概有哪些方面的原因会导致这种结果?
在有网络的时候可以正常连接,但在无网络的时候会在pc_client_destroy处卡死!附代码:
pc_client_t* gateClient = pc_client_new();
struct sockaddr_in address;
memset(&address, 0, sizeof(struct sockaddr_in));
address.sin_family = AF_INET;
address.sin_port = htons(SERVER_PORT);
address.sin_addr.s_addr = inet_addr(SERVER_HOST);
if (pc_client_connect(gateClient, &address)) {
CCLog("Gate server connected failed!\n");
mState = CLOSED;
pc_client_destroy(gateClient);
return;
}
如题,应该在client.c的以下位置进行修改:
void pc__close_async_cb(uv_async_t *handle, int status) {
pc_client_t *client = (pc_client_t *)handle->data;
// 服务器端主动断开连接时,抛出断开事件
pc_emit_event(client, PC_EVENT_DISCONNECT, NULL);
pc_client_stop(client);
}
server.json如下:
{
"development":{
"connector": [
{"id": "connector-server-1", "host": "127.0.0.1", "port": 3150, "clientPort": 3010, "frontend": true},
{"id": "connector-server-2", "host": "127.0.0.1", "port": 3151, "clientPort": 3011, "frontend": true},
{"id": "connector-server-3", "host": "127.0.0.1", "port": 3152, "clientPort": 3012, "frontend": true}
],
"chat": [
{"id": "chat-server-1", "host": "127.0.0.1", "port": 6150},
{"id": "chat-server-2", "host": "127.0.0.1", "port": 6151},
{"id": "chat-server-3", "host": "127.0.0.1", "port": 6152}
],
"gate":[
{"id": "gate-server-1", "host": "127.0.0.1", "port": 3153, "clientPort": 3014, "frontend": true}
]
},
"production":{
"connector": [
{"id": "connector-server-1", "host": "127.0.0.1", "port": 3150, "clientPort": 3010, "frontend": true},
{"id": "connector-server-2", "host": "127.0.0.1", "port": 3151, "clientPort": 3011, "frontend": true},
{"id": "connector-server-3", "host": "127.0.0.1", "port": 3152, "clientPort": 3012, "frontend": true}
],
"chat": [
{"id": "chat-server-1", "host": "127.0.0.1", "port": 6150},
{"id": "chat-server-2", "host": "127.0.0.1", "port": 6151},
{"id": "chat-server-3", "host": "127.0.0.1", "port": 6152}
],
"gate":[
{"id": "gate-server-1", "host": "127.0.0.1", "port": 3153, "clientPort": 3014, "frontend": true}
]
}
}
开启web-server时,能正常连接到gate。
用libpomelo的echo.c连接到connector-server-1时,正常,更改端口,使其连接到gate。
屏幕一闪过去了。
调试后发现 pc_client_connect 返回值 -1. 但未出现failed to connect server之类。或者其他的err message。
请问,这是何解? libpomelo的库问题?还是game-server的配置问题?
如果是game-server的配置问题,那么为何web-server能顺利连接?
另外,请问,能给一个libpomelo的API文档么?想改点什么现在都得看源码。。。
如题。
编译我是直接make的
提供的类库能否应用在wince6平台下,我考虑是否能在wince上做个客户应用。
另:flash lite 3.1支持pomelo提供的flash客户端接口吗?
I'm using the tcp-pomelo test server:
"echo" : works
"request": works
but:
"echo2": wrong IP: const char *ip = "192.168.1.116"; => should be 127.0.0.1, then works
"robot_chat": wrong port: #define GATE_PORT 3014 => should be 3010, but fails after sending a line (or by starting a robot)
"notify": does not exit
libuv一直有错误,刚开始更多,引入了ws2_32.lib之后错误少了很多,但还是有四个错误:
1>libuv.lib(getaddrinfo.obj) : error LNK2019: 无法解析的外部符号
__imp__GetAddrInfoW@16,该符号在函数 _getaddrinfo_thread_proc@4 中被引用 1>libuv.lib(getaddrinfo.obj) : error LNK2019: 无法解析的外部符号
__imp__FreeAddrInfoW@4,该符号在函数 _uv_process_getaddrinfo_req 中被引用 1>libuv.lib(util.obj) : error LNK2019: 无法解析的外部符号
_GetAdaptersAddresses@20,该符号在函数 _uv_interface_addresses 中被引用 1>libuv.lib(util.obj) : error LNK2019: 无法解析的外部符号
_GetProcessMemoryInfo@12,该符号在函数 _uv_resident_set_memory 中被引用 1>E:\work\pomelo\multi-platform-cpp\proj.win32\Debug.win32\HelloCpp.exe : fatal error LNK1120: 4 个无法解析的外部命令
关于pomelo的三个项目libpomelo,libuv,jannson都进了解决方案,自己项目的依赖也设置了,在项目属性中依赖库叶把对应三个lib库手动加了进去,之后为了解决libuv错误还加了ws2_32.lib。
环境是windows vs2012 cocos2d-x 2.1.5
日志为fail to connect server.,state 5这是为啥?
memory.h is still in pomelo.gyp.please change it to jansson-memory.h.
参考readme.md编译出来的静态LIB,在DEBUG下没有问题,在release编译的时候,出现
error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”
这个错误。
好像是因为静态LIB不是release的问题?
请问如何讲libpomelo编译为release版本
之前有decode的問題
http://nodejs.netease.com/topic/51dec60fb6c6203329062649
@fantasyni libpomelo的這個fix好像只是修了客戶端受到repeated string的bug 客戶端發出repeated string的encode似乎也有問題,客戶端發出一個repeated string,服務端是解析不出來的。
使用其他的如unity3d的客戶端是沒有問題的。
ibuv一直有错误,刚开始更多,引入了ws2_32.lib之后错误少了很多,但还是有四个错误:
1>libuv.lib(getaddrinfo.obj) : error LNK2019: 无法解析的外部符号
__imp__GetAddrInfoW@16,该符号在函数 _getaddrinfo_thread_proc@4 中被引用 1>libuv.lib(getaddrinfo.obj) : error LNK2019: 无法解析的外部符号
__imp__FreeAddrInfoW@4,该符号在函数 _uv_process_getaddrinfo_req 中被引用 1>libuv.lib(util.obj) : error LNK2019: 无法解析的外部符号
_GetAdaptersAddresses@20,该符号在函数 _uv_interface_addresses 中被引用 1>libuv.lib(util.obj) : error LNK2019: 无法解析的外部符号
_GetProcessMemoryInfo@12,该符号在函数 _uv_resident_set_memory 中被引用 1>E:\work\pomelo\multi-platform-cpp\proj.win32\Debug.win32\HelloCpp.exe : fatal error LNK1120: 4 个无法解析的外部命令
关于pomelo的三个项目libpomelo,libuv,jannson都进了解决方案,自己项目的依赖也设置了,在项目属性中依赖库叶把对应三个lib库手动加了进去,之后为了解决libuv错误还加了ws2_32.lib。
环境是windows vs2012 cocos2d-x 2.1.5
我看到request方式和notify方式都会传进回调函数,区别只是一个带了服务端传回的数据,另一个没带,我想知道notify的回调函数调用的时机和request一样吗?既然request需要服务端传回的数据,那么notify不需要服务端的数据,那它的回调函数到底是为什么呢?是在等服务端传回什么信号吗?如果是这样,那notify跟request岂不是没有什么区别。
With the latest version the issue reported here still exists
http://nodejs.netease.com/topic/51ed5f02b6c6203329144bc4
Server version: 0.5.3
我这两天看了你们的C平台的sdk,如果要让libpomelo在cocoa2d-x下同时支持android和ios,解决的办法是否是将这个编译成.a静态库供给ios使用,编成.so给android使用;有这方面的教程吗?谢谢。
static size_t pc__pkg_head(pc_pkg_parser_t *parser,
...
(line167)pkg_len += parser->head_buf[i];
.....
when data is ox"01 00 00 f3", pkg_len got 0xfffffff3 ,malloc error
I changed
pkg_len += (size_t)(unsigned char)parser->head_buf[i];
then ok. thanks,good job.
It would be very nice if you could create a windows libpomelo.dll so we could use pomelo with other compiler languages as well. Thank you!
const char *ip = "127.0.0.1";
int port = 3014;
int main() {
// create a client instance.
pc_client_t *client = pc_client_new();
struct sockaddr_in address;
memset(&address, 0, sizeof(struct sockaddr_in));
address.sin_family = AF_INET;
address.sin_port = htons(port);
address.sin_addr.s_addr = inet_addr(ip);
// add some event callback.
pc_add_listener(client, PC_EVENT_DISCONNECT, on_close);
// try to connect to server.
if(pc_client_connect(client, &address)) {
printf("fail to connect server.\n");
pc_client_destroy(client);
return 1;
}else{
printf("connect success!");
}
}
which cocos2d-x version should I use? while using current cocos2d-x master, there is no third_party directory anymore. Trying to compile it results only in a libpomelo.a (but I need libpomelo.so). Any advise is welcome
我是用cocos2d-x客户端,能不能给个大概思路,客户端如何跟pomelo服务器连接上
加上会方便很多啊,jannson库是可以支持bool的
详细情况见 laoyur/CCPomeloWrapper#1
测试代码如下:
int main(int argc, const char * argv[])
{
int count = 0;
pc_client_t* client;
for (;;)
{
switch (count % 4)
{
case 0:
{
struct sockaddr_in address;
memset(&address, 0, sizeof(struct sockaddr_in));
address.sin_family = AF_INET;
address.sin_port = htons(3017);
address.sin_addr.s_addr = inet_addr("127.0.0.1");
client = pc_client_new();
pc_client_connect(client, &address);
}
break;
case 1:
pc_client_destroy(client);
break;
case 2:
{
struct sockaddr_in address;
memset(&address, 0, sizeof(struct sockaddr_in));
address.sin_family = AF_INET;
address.sin_port = htons(3010);
address.sin_addr.s_addr = inet_addr("127.0.0.1");
client = pc_client_new();
pc_client_connect(client, &address);
}
break;
case 3:
pc_client_destroy(client);
break;
}
count++;
sleep(1);
}
return 0;
}
重复连接3、5次后程序会崩溃。
在64位win7下下载代码,不修改编译选项直接编译然后运行tcp的那个服务端,echo等例子无法连通服务端,把tcp的服务端转到64位linux下,依然无法连通
单独写一个测试程序,一切正常
xcode 5 cocos2dx 2.2.2 项目中,主线程调用request,卡死,回调函数没响应
是不是线程的问题?
/libpomelo/include/pomelo.h:25:10: 'uv.h' file not found
我知道有一个
https://github.com/NewYuil/libpomelo 里面提供的版本是能在android-ndk环境下编译的
但是2个仓库的代码差异很大,并且NewYuil/libpomelo 版本里面问题很多。
我希望开发的时候能只关注一个Libpomelo
https://github.com/NetEase/libpomelo 能否支持一下在android-ndk环境下编译?
add these code in pc__client_init, otherwise it will crash
uv_mutex_init(&client->state_mutex);
void run_robot() {
int i = 0;
for (i = 0; i < MAX_RUN_NUM; i++) {
printf("send %d\n", i+1);
char str[10] = "test";
char tmp[10];
sprintf(tmp, "%d", i);
strcat(str, tmp);
msg_send(str, channel, user, "*");
#ifndef WIN32
sleep(1);
Sleep(1);
}
之前有decode的問題
http://nodejs.netease.com/topic/51dec60fb6c6203329062649
@fantasyni libpomelo的這個fix好像只是修了客戶端受到repeated string的bug 客戶端發出repeated string的encode似乎也有問題,客戶端發出一個repeated string,服務端是解析不出來的。
使用其他的如unity3d的客戶端是沒有問題的。
iOS 应用使用libpomelo 版本0.3.2,
应用切到后台,开启飞行模式,等待心跳超时后再返回应用(不重现就等待久一点,5分钟以上),
这个时候会调用pc_client_stop,
而pc_client_stop会调用uv_mutex_lock,调用返回22,按照代码逻辑会直接调用abort。
void uv_mutex_lock(uv_mutex_t* mutex) {
if (pthread_mutex_lock(mutex)) // 切到后台后回来,这里返回22
abort();
}
/Users/zacharyhu/Downloads/libpomelo-master/src/pkg-handshake.c:211:3: error:
implicit declaration of function 'pc__heartbeat' is invalid in C99
[-Werror,-Wimplicit-function-declaration]
pc__heartbeat(client);
^
/Users/zacharyhu/Downloads/libpomelo-master/src/pkg-handshake.c:127:32: warning:
implicit conversion loses integer precision: 'long long' to 'int'
[-Wshorten-64-to-32]
client->heartbeat = hb * 1000;
~ ~~~^~~~~~
1 warning and 1 error generated.
** BUILD FAILED **
The following build commands failed:
CompileC build/pomelo.build/Default-iphoneos/libpomelo.build/Objects-normal/arm64/pkg-handshake.o src/pkg-handshake.c normal arm64 c com.apple.compilers.llvm.clang.1_0.compiler
(1 failure)
好像wiki里只说了怎么在android下编译运行,有关于ios下运行的介绍吗
当使用pc_request时 会出现
Fail to json encode for message.
Fail to encode message with json: gate.gateHandler.authUID
Fail to encode request message.
之后线程卡死,追代码发现到msg-json.c里的json_dumps不知是否这里有问题?
在此附上代码
//Login waterfall
void MenuLayer::_doLoginWaterFall()
{
//new a client
pc_client_t* client = pc_client_new();
_connectServer(client);
}
void MenuLayer::_connectServer(pc_client_t* client)
{
const char* ip = GATE_HOST;
const int port = GATE_PORT;
struct sockaddr_in address;
memset(&address, 0, sizeof(struct sockaddr_in));
address.sin_family = AF_INET;
address.sin_port = htons(port);
address.sin_addr.s_addr = inet_addr(ip);
if(pc_client_connect(client, &address))
{
//Future : Print on the UI
//Now : log at Console
CCLOGERROR("Fail to connect to server.");
pc_client_destroy(client);
return;
}
//Print on Console
CCLOG("Connect to server.");
//pass to next step
_sendRequest(client);
}
void MenuLayer::_sendRequest(pc_client_t* client)
{
const char* route = "gate.gateHandler.authUID";
json_t* msg = json_object();
json_t* uid = json_string("0");
json_object_set(msg, "uid", uid);
//decref
json_decref(msg);
pc_request_t* req = pc_request_new();
pc_request(client, req, route, msg, _onAuthUIDRequestCallback);
}
void MenuLayer::_onAuthUIDRequestCallback(pc_request_t* req,int status,json_t* resp)
{
if(status==-1)
{
CCLOG("Fail to send request to server");
}
else if(status==0)
{
char* json_str = json_dumps(resp, 0);
if(json_str!=nullptr)
{
CCLOG("server response:%s",json_str);
free(json_str);
}
}
//release
json_t* msg = req->msg;
pc_client_t* client = req->client;
json_decref(msg);
pc_request_destroy(req);
//stop
pc_client_stop(client);
}
//
$make
Makefile:26: /data/archives/libpomelo/libpomelo/deps/uv/build.mk: No such file or directory
make: *** No rule to make target `/data/archives/libpomelo/libpomelo/deps/uv/build.mk'. Stop.
pc_client_t *client = pc_client_new();
这句报错。
bt信息如下:
strlen + 16, stop reason = EXC_BAD_ACCESS (code=1, address=0xf35d8d20) frame #0: 0x9441d640 libsystem_c.dylib
strlen + 16__vfprintf + 6254 frame #2: 0x9449e48b libsystem_c.dylib
vsnprintf_l + 220vsnprintf + 74 frame #4: 0x029efbbf libsystem_sim_c.dylib
__snprintf_chk + 47_interposition_vtable_unimplemented + 123 frame #6: 0x02726bd8 libSystem.dylib
write$UNIX2003 + 60uv__signal_unlock + 48 at signal.c:89 frame #8: 0x001a9265 project_xxx
uv__signal_global_init + 43 at signal.c:61pthread_once + 77 frame #10: 0x001a9235 project_xxx
uv__signal_global_once_init + 36 at signal.c:67uv__loop_init(loop=0x0019da41, default_loop=0) + 20 at loop.c:33 frame #12: 0x001a4987 project_xxx
uv_loop_new + 41 at core.c:235Win7执行 “build\gyp\gyp.bat --depth=. pomelo.gyp -Dlibrary=static_library”
NameError: name 'TO' is not defined while evaluating condition 'TO == "ios"' in
pomelo.gyp while trying to load pomelo.gyp
小弟菜鸟,请问能不能给一个用到udp的例子?
According to the comment,
/**
it seems when error fed in "next" callback the status should be -1. But when I call something like this
next(new Error('what's up'), {});
I never got -1 in request callback. Anything wrong?
“在pomelo 0.6版本中,对hybridconnector增加了数据签名的功能。客户端首先产生rsa的密钥对,客户端保留rsa私钥,在握手阶段客户端将公钥发到服务端;在发送消息阶段,客户端使用私钥对消息进行签名,客户端将消息和签名一起发送到服务端,服务端进行签名验证,如果验证成功后面的流程继续,如果验证失败则该数据包则不进行处理。”
0.6里增加数据加密功能,但我看到libpomelo已经几个月没更新了,看源码也没看到加密相关的内容?是否现在还不支持?什么时候能加上支持功能?
issue still there with the latest version
#29
I tested by sending requests every 0.1 second. The error shows up quickly again.
照着chat的ios编译说明编译成功了 但是Android编译时报错, 用的系统是MAC
cocos2dx/platform/third_party/android/prebuilt/libpomelo/deps/uv/include/uv-private/uv-unix.h:112:1: error: unknown type name 'pthread_rwlock_t'
照着例子对android.mk做了对应的修改。
是不是因为我用的MAC系统?chat例子中的设置好像是针对windows的。MAC系统上需要其他设置吗?
目前libpomelo自带的libuv版本比较老,其中有些libuv的API已经有变化,建议更新deps目录下的libuv到最新版本。
假设我服务端的广播为{ 'route':"onPushTest" , 'msg' : 'hello' }
libpomelo监听服务端广播的回调函数定义为:
void on_pushtest(pc_client_t *client, const char *event, void *data) ;
event 是 “onPushTest“ 没有问题。
这里的data 的原始类型是 json_t 。无法取到我发送的“hello”。
json_t msg = (json_t) data; //只能这样强转
我觉得data的原始类型至少应该是 pc__msg_raw_t 。
是不是个bug,还是我使用错误?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.