C++编写nodejs扩展实战

C++编写nodejs扩展实战

之前有用PHP写过根据IP地址查询IP归属地,后来改用C语言编写,效率果然大幅度提高,然后转化为PHP的扩展.

想起之前有过使用手机号码查询号码归属地,最近又有在研究nodejs,于是就使用C++编写了nodejs的扩展.

遇到的问题确实不少,记录下来,供大家参考:

1.字符编码的问题:nodejs对于gbk编码支持不够好,为了提高程序效率,先把IP归属地的资源转化为utf-8的编码,具体使用PHP脚本foreach使用iconv转换

2.参数传递的问题,很多程序里面都写个helloworld的nodejs扩展的C++实现,但是这里面没有参数传递呐,参考了nodejs官网,总是找不到int类型,怎么从javascript转化为C++,本着有困难找度娘的心理,果然让我找到了:使用args[0]->Int32Value()就可以转化了

3.具体编写的过程如下:

a.编写binding.gyp,先写好最简配置:

{

‘targets‘:[

{

‘targetname‘:‘mtc‘

‘source‘:[‘mtc.cc‘]

}

]

}

其中targetname是模块名,require的时候用

source是C++源文件的名字放在binding.gyp同目录下

b.编写C++的源代码:

#include <node.h>
#include <v8.h>
using namespace v8;
const int MaxCityLength = 25;

char* Search(const char* fileName, const int& number);

class Info{

public:

Info():mbefore(0),mafter(0),m_cityIndex(0) {

}
Info(int begin, unsigned short skip, unsigned short city_index){
    setBegin(begin);
    setSkip(skip);
    m_cityIndex = city_index;
}
int getBegin() {
    int lastTwo = m_after - getNumberExceptLastTwo()*100;
    return m_before * 100 + lastTwo;
}

unsigned short getNumberExceptLastTwo() {
    return m_after * 0.01;
}

unsigned short getCityIndex() {
    return m_cityIndex;
}

unsigned short getLastTwo(int number) {
    int exceptLastTwoNum = number * 0.01;
    return (number - exceptLastTwoNum * 100);
}

void setBegin(int& number) {
    int lastTwo = getLastTwo(number);
    m_before = number * 0.01;
    m_after = getNumberExceptLastTwo();
}

void setSkip(unsigned short skip) {
    m_after = getNumberExceptLastTwo() * 100 + getLastTwo(m_after);
}

void setCityIndex(unsigned short& city) {
    m_cityIndex = city;
}
char* FindResult(FILE* file, const int& count, Info info){
    int totalOffset = sizeof(int) + count*sizeof(Info) + info.getCityIndex()* MaxCityLength;
    fseek(file, totalOffset,SEEK_SET);
    char* location = new char [MaxCityLength];
    fread(location, MaxCityLength, 1, file);
    fclose(file);
    return location;
}

private:

unsigned short mbefore;

unsigned short mafter;

unsigned short m_cityIndex;

};

char* search(const char* fileName, const int& number) {

FILE* file = 0;

file = fopen(fileName, "rb");

if(file == 0) {

return (char*) "";

}
int count = 0;
fread(&count ,sizeof(int), 1, file);
int left = 0, right = count - 1;
Info info;
while(left < right) {
    int middle = (left + right)/2;
    fseek(file, sizeof(int) + middle * 6 ,SEEK_SET);
    fread(&info ,sizeof(unsigned short)*3, 1, file);
    if(number < info.getBegin()) {
        right =middle -1;
    } else if(number >info.getBegin() + info.getNumberExceptLastTwo()) {
        left = middle +1;
    } else {
        return info.FindResult(file, count,info);
    }
}
return (char*) "";

}

Handle mtc(const Arguments& args) {

HandleScope scope;

char* ret = search("AreaData.dat", args[0]->Int32Value());

return scope.Close(String::New((char*)ret));

}

void init(Handle<Object> target) {

NODESETMETHOD(target, "m2c", mtc);

}

NODE_MODULE(mtc, init);

c.使用下面的两条命令就OK了:

node-gyp configure
node-gyp build

最后就会生成mtc.node文件:

写测试文件test.js

var mtc = require(‘mtc‘);

console.log(‘mtc.mtc()=‘,mtc.mtc(1895926))

执行:node test.js就会输出福建厦门

所有的源文件上传到了腾讯微云上:

http://url.cn/Rezn0U

欢迎下载

C++编写nodejs扩展实战

时间: 2024-10-09 01:58:51

C++编写nodejs扩展实战的相关文章

NodeJS初学者实战之旅(I) —— 介绍、目录

旅行之初 作为一个工作了两年多后端开发人员,未接触过NodeJS,对它的认知也仅仅停留在“可以使用JavaScript代码编写服务端程序”上.最近空闲时间 较多,便想来啃它一啃.但是没有一个实际的玩意儿想要去了解一门编程语言是不太现实的嘛,加上我最近也想把去年学习园子里大牛写的一个种子搜索网站重构,那么,为啥我不使用NodeJS呢? 于是功能需求出现了:使用NodeJS开发出一个能智能抓取.分析.存储种子的程序,并在后期做一个能提供种子搜索功能的网站! 于是便有了本系列——NodeJS初学者实战

手动使用C/C++编写Lua扩展插件

最近在研究如何在Windows 下嵌入Lua来完成业务模块编写的时候 发现Lua的一些问题,首先Lua作为一门脚本语言,其灵活性和可扩展性是很高的,要不然Cocos2d-x中也不会嵌入他来编写业务逻辑,但是由于国内资料相当的少,很少有人去正八经研究完了之后 写一篇文章 来分享自己的成果,想要去深入理解应用一些东西得时候,显得很无力,很多Lua扩展都是直接写扩展库来完成,如果不理解原理甚至你都不会灵活运用,这就是本文写作的目的. 第一 我需要Lua嵌入我的应用程序,这一点很容易的做到. 第二 我需

怎样编写scrapy扩展

原创文章,链接:http://blog.csdn.net/u012150179/article/details/38226477 在scrapy使用过程中,很多情况下需要根据实际需求定制自己的扩展,小到实现自己的pipelines,大到用新的scheduler替换默认的scheduler. 扩展可以按照是否需要读取crawler大致分为两种,对于不需要读取的,比如pipelines的编写,只需要实现默认的方法porcess_item.需要读取的,如scheduler的编写又存在另外的方式. 1.

一步步入门编写PHP扩展

1.写在最前 随着互联网飞速发展,lamp架构的流行,php支持的扩展也越来越多,这样直接促进了php的发展. 但是php也有脚本语言不可避免的问题,性能比例如C等编译型语言相差甚多,所以在考虑性能问题的时候最好还是通过php扩展来解决. 那么,怎么去做一个php扩展呢.下面从一个例子开始(本文章需要C基础). 2.解决一个问题 在一个系统中,如果经常要求一个数组的平方和,我们可以这么写. <?php function array_square_sum($data){ $sum = 0; for

专门为前端工程师设计 Nodejs+React 实战开发区块链“慕课”Dapp资源教程百度云

资源获取链接:点击这里 第1章 课程导学 对课程整体的知识点,项目进行介绍. 1-1 课程导学 第2章 区块链概念科普 使用村庄的例子介绍区块链是什么,分布式记账的过程和不可篡改性,常见的数字货币都有哪些,以及区块链技术的前景的介绍. 2-1 区块链是什么 2-2 数字货币 2-3 区块链应用场景 第3章 区块链技术概念科普 使用课程辅助工具iblockchain,介绍区块链里的哈希,非对称加密,挖矿,记账,分布式的技术原理. 3-1 哈希 3-2 共识POW,POS和DPOS 3-3 非对称加

Nodejs + React 实战开发区块链慕课Dapp 专门为前端工程师设计

第1章 课程导学对课程整体的知识点,项目进行介绍. 1-1 课程导学 试看第2章 区块链概念科普使用村庄的例子介绍区块链是什么,分布式记账的过程和不可篡改性,常见的数字货币都有哪些,以及区块链技术的前景的介绍. 2-1 区块链是什么 试看 2-2 数字货币 2-3 区块链应用场景第3章 区块链技术概念科普使用课程辅助工具iblockchain,介绍区块链里的哈希,非对称加密,挖矿,记账,分布式的技术原理. 3-1 哈希 3-2 共识POW,POS和DPOS 3-3 非对称加密 3-4 拜占庭将军

pytorch 学习笔记之编写 C 扩展,又涨姿势了

pytorch利用CFFI 进行 C 语言扩展.包括两个基本的步骤(docs): 编写 C 代码: python 调用 C 代码,实现相应的 Function 或 Module. 在之前的文章中,我们已经了解了如何自定义 Module.至于 [py]torch 的 C 代码库的结构,我们留待之后讨论: 这里,重点关注,如何在 pytorch C 代码库高层接口的基础上,编写 C 代码,以及如何调用自己编写的 C 代码. 官方示例了如何定义一个加法运算(见 repo).这里我们定义ReLU函数(见

【转】编写Chrome扩展程序

Chrome的扩展程序很多,也很容易入门,可以来简单实现一下 看看 官方文档 或者翻译的文档:百度.360,慢慢就能实现出一个扩展程序来 每个扩展程序应用一般会包含: 一个manifest清单文件 html文件 js文件 其他文件等 可以看到,其实结构如同一般的页面,有共通之处. 一.了解Chrome扩展程序 Chrome扩展程序商店地址为:https://chrome.google.com/webstore/category/extensions?hl=zh-CN 访问Chrome浏览器中已安

【自】十天学会NodeJs的实战运用,express框架的应用(一)

十天学会NodeJs第一篇 Node.js是什么? 运行在服务端的JavaScript,其本质还是JavaScript 服务端运行在Google V8引擎,速度快,性能好 官网:https://nodejs.org/en/ 所有代码均在git上面可以下载查看:https://github.com/shiyou00/NodeJs 学习之前你需要具备什么? 1.熟悉JavaScript语法 2.安装好node 正式开始吧! 程序的开始都是hello world 我们如何编写? 直接编写普通的js文件