nodejs与c++(nodejs与cookie)
更新:2022-11-13 15:11
本文目录一览:
- [nodejs的C/C++ addons机制是怎么实现的](#nodejs的C/C++ addons机制是怎么实现的)
- c#和nodejs 哪个前期学习容易
- nodejs如何把c指针转成buffer
- 如何在Windows下开发NodeJS的C/C++原生扩展
nodejs的C/C++ addons机制是怎么实现的
#define NODE_MODULE(modname, regfunc) \
extern "C" { \
NODE_MODULE_EXPORT node::node_module_struct modname ## _module = \
{ \
NODE_STANDARD_MODULE_STUFF, \
regfunc, \
NODE_STRINGIFY(modname) \
}; \
}
NODE_MODULE(name, init);
展开后就是:
extern "C" {
node::node_module_struct name_module =
{
1, // NODE_MODULE_VERSION
NULL,
__FILE__,
init,
"name"
};
}
其实就是定义了一个结构体,编译后为动态链接库 .node
文件中的一个符号,最后使用的时候由 node.cc
调用 uv_dlopen
和 uv_dlsym
动态链接模块,得到初始化函数并执行。
mod-register_func(target);
uv
库封装了对动态链接文件操作的具体实现,Windows 下实际调用 LoadLibraryExW
和 GetProcAddress
,Unix 下实际调用 dlopen
和 dlsym
实现上述功能。
c#和nodejs 哪个前期学习容易
C语言和C#当然是先学C语言比较好,C语言一般认为是编程新手最好初次编程接触的语言了,其中的语法和一些思想对其它语言都有一定的影响。有了C语言,其它语言问题应该都不会太大的。 C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。 C#是一种安全的、稳定的、简单的、优雅的,由C和C衍生出来的面向对象的编程语言。它在继承C和C强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。
nodejs如何把c指针转成buffer
在nodejs里面需要通过socket向C进程发送结构体数据。
Buffer
作为 nodejs 中重要的概念和功能,为开发者提供了操作二进制的能力。Buffer
是 nodejs 核心 API,它提供我们处理二进制数据流的功能。Buffer
的使用和 ES2017
的 Uint8Array
非常相似,但由于 node 的特性,专门提供了更深入的 api。Buffer
类是用来处理二进制数据,因为太常用了,所以直接放在了全局变量里,使用的时候无需 require。
如何在Windows下开发NodeJS的C/C++原生扩展
一、编写Node.js原生扩展
Node.js是一个强大的平台,理想状态下一切都都可以用javascript写成。然而,你可能还会用到许多遗留的库和系统,这样的话使用c编写Node.JS扩展会是一个不错的主意。 以下所有例子的源代码可在node扩展示例中找到。 编写Node.js C扩展很大程度上就像是写V8的扩展;Node.js增加了一些接口,但大部分时间你都是在使用原始的V8数据类型和方法,为了理解以下的代码,你必须首先阅读V8引擎嵌入指南。
Javascript版本的Hello World
在讲解C版本的例子之前,先让我们来看看在Node.js中用Javascript编写的等价模块是什么样子。这是一个最简单的Hello World,也不是通过HTTP,但它展示了node模块的结构,而其接口也和大多数C扩展要提供的接口差不多:
HelloWorldJs = function() {
this.m_count = 0;
};
HelloWorldJs.prototype.hello = function() {
this.m_count++;
return "Hello World";
};
exports.HelloWorldJs = HelloWorldJs;
正如你所看到的,它使用prototype为HelloWorldJs类创建了一个新的方法。请注意,上述代码通过将HelloWorldJS添加到exports变量来暴露构造函数。 要在其他地方使用该模块,请使用如下代码:
var helloworld = require('helloworld_js');
var hi = new helloworld.HelloWorldJs();
console.log(hi.hello()); // prints "Hello World" to stdout
C++版本的Hello World
要开始编写C++扩展,首先要能够编译Node.js(请注意,我们使用的是Node.js 2.0版本)。本文所讲内容应该兼容所有未来的0.2.x版本。一旦编译安装完node,编译模块就不在需要额外的东西了。 完整的源代码可以在这里找到。在使用Node.js或V8之前,我们需要包括相关的头文件:
#include <v8.h>
#include <node.h>
using namespace node;
using namespace v8;
在本例子中我直接使用了V8和node的命名空间,使代码更易于阅读。虽然这种用法和谷歌的自己的C++编程风格指南相悖,但由于你需要不停的使用V8定义的类型,所以目前为止的大多数node的扩展仍然使用了V8的命名空间。
接下来,声明HelloWorld类。它继承自node::ObjectWrap
类,这个类提供了几个如引用计数、在V8内部传递context等的实用功能。一般来说,所有对象应该继承ObjectWrap
:
class HelloWorld : ObjectWrap {
private:
int m_count;
public:
声明类之后,我们定义了一个静态成员函数,用来初始化对象并将其导入Node.js提供的target对象中。这个函数基本上是告诉Node.js和V8你的类是如何创建的,和它将包含什么方法:
static Persistent<FunctionTemplate> s_ct;
static void Init(Handle<Object> target) {
HandleScope scope;
Local<FunctionTemplate> t = FunctionTemplate::New(New);
s_ct = Persistent<FunctionTemplate>::New(t);
s_ct->InstanceTemplate()->SetInternalFieldCount(1);
s_ct->SetClassName(String::NewSymbol("HelloWorld"));
NODE_SET_PROTOTYPE_METHOD(s_ct, "hello", Hello);
target->Set(String::NewSymbol("HelloWorld"),
s_ct->GetFunction());
}
在上面这个函数中target参数将是模块对象,即你的扩展将要载入的地方。首先我们为New方法创建一个FunctionTemplate,将于稍后解释。我们还为该对象添加一个内部字段,并命名为HelloWorld。然后使用NODE_SET_PROTOTYPE_METHOD
宏将hello方法绑定到该对象。最后,一旦我们建立好这个函数模板后,将他分配给target对象的HelloWorld属性,将类暴露给用户。
接下来的部分是一个标准的C++构造函数:
HelloWorld() : m_count(0) {}
~HelloWorld() {}
接下来,在New
方法中V8引擎将调用这个简单的C++构造函数:
static Handle<Value> New(const Arguments& args) {
HandleScope scope;
HelloWorld* hw = new HelloWorld();
hw->Wrap(args.This());
return args.This();
}
此段代码相当于上面Javascript代码中使用的构造函数。它调用new HelloWorld
创建了一个普通的C对象,然后调用从ObjectWrap
继承的Wrap
方法,它将一个CHelloWorld类的引用保存到args.This()
的值中。在包装完成后返回args.This()
,整个函数的行为和javascript中的new运算符类似,返回this指向的对象。
现在我们已经建立了对象,下面介绍在Init
函数中被绑定到hello的函数:
static Handle<Value> Hello(const Arguments& args) {
// ...
}