最近在研究boost.python,因为想用C++做网络底层,然后用Python做逻辑层开发,以期待获得开发效率跟程序执行效率的平衡点,更重要的是,对于游戏服务端来说,稳定性绝对是最重要的,在硬件相当强悍和廉价的情况下,稳定性更加是一个游戏服务端设计者应该首要考虑的问题,毋庸置疑,python的容错性比C++要高很多。
闲话少说,言归正传。在包装C++的代码中,我做了不少小实验。因为为了快速开发,我想用python本身提供的socket API,这样就遇到了一个问题,如何把C++代码序列化出来的二进制流传给Python?比较容易想到的,就是直接返回一个char *指针,指向这段缓冲区的首地址。实验中,遇到如下几个问题:
1.返回类型必须是const char*,不可以是char*。
2.如果返回const char*,则在python里调用len计算这串字符串的时候,跟传统的C字符串一样,遇到零就认为是结束了。
3.如果返回的是string,则不存在第二个问题,但是,由于我们原来的消息类序列化出来的是一个char数组,所以,为了返回string,我不得不构造一个string对象,这造成了内存的二次拷贝。
小结:目前只能用返回string的方式来实现,如果确实需要满足自己的特殊需求,可能需要花时间去研究boost的源码了,另外一种解决方式就是,直接使用c++ socket api,把收发消息的细节完全隐藏在C++模块里。
闲话少说,言归正传。在包装C++的代码中,我做了不少小实验。因为为了快速开发,我想用python本身提供的socket API,这样就遇到了一个问题,如何把C++代码序列化出来的二进制流传给Python?比较容易想到的,就是直接返回一个char *指针,指向这段缓冲区的首地址。实验中,遇到如下几个问题:
1.返回类型必须是const char*,不可以是char*。
2.如果返回const char*,则在python里调用len计算这串字符串的时候,跟传统的C字符串一样,遇到零就认为是结束了。
3.如果返回的是string,则不存在第二个问题,但是,由于我们原来的消息类序列化出来的是一个char数组,所以,为了返回string,我不得不构造一个string对象,这造成了内存的二次拷贝。
小结:目前只能用返回string的方式来实现,如果确实需要满足自己的特殊需求,可能需要花时间去研究boost的源码了,另外一种解决方式就是,直接使用c++ socket api,把收发消息的细节完全隐藏在C++模块里。