标签: libev

Nodejs事件循环

nodejs架构内部有两个事件循环吗?

  • libev/libuv
  • v8 javascript事件循环

在I/O请求上,节点将请求排队到libeio,后者又通过使用libev的事件通知数据的可用性,最后这些事件是由v8事件循环使用回调来处理的吗?

基本上,libev和libeio如何集成在nodejs架构中?

有没有可用于提供nodejs内部架构清晰图片的文档?

javascript event-loop node.js libev

137
推荐指数
5
解决办法
3万
查看次数

libev和libevent有什么区别?

这两个lib都是为异步i/o调度而设计的,都是在linux上使用epoll,在FreeBSD上使用kqueue等.

除了肤浅的差异,我的意思是这两个库之间的真正区别是什么?关于建筑或设计哲学?

libevent libev

92
推荐指数
2
解决办法
3万
查看次数

如何增加osx上的套接字限制以进行负载测试?

我正在创建一个负载测试程序,它使用libev为我正在处理的应用程序创建大量开放式TCP连接.由于nofiles限制,目前它以256个连接轰炸:

ulimit -n
256
Run Code Online (Sandbox Code Playgroud)

通过执行以下操作,我可以将此值增加到1024:

ulimit -n 1024
Run Code Online (Sandbox Code Playgroud)

但我不能进一步增加它.理想情况下,我想将其设置为1048576.它给出以下错误:

ulimit: open files: cannot modify limit: Invalid argument
Run Code Online (Sandbox Code Playgroud)

如何在osx上进一步增加ulimit?

sockets macos freebsd libev

29
推荐指数
2
解决办法
2万
查看次数

Libev,如何将参数传递给相关的回调

我陷入了在libev中传递争论的局面.

通常,libev在类似*receive_callback*的函数中接收包,这没关系,但实际上,我们需要根据收到的包调度相对*write_callback*来处理特定的作业.例如:

S_RECV_MSG* pstRecvMsg = (S_RECV_MSG*) recv_buff;
switch(pstRecvMsg->wMsgType) {
    case 1: 
        ev_io_init(w, write_callback1, w->fd, EV_WRITE);
        break;
    case 2:
        ev_io_init(w, write_callback2, w->fd, EV_WRITE);
        break;
    case 3:
        // .......
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果write_callbackX还必须读取recv_buff中的具体内容,我们如何将recv_buff参数传递给callbackX?我们必须承担全球变量的负担和丑陋吗?

c callback libev

23
推荐指数
1
解决办法
4063
查看次数

C结构的第一个字段是否始终保证偏移为0?

关于C编程语言......

C/C++结构偏移的部分问题表明"&并不总是指向结构第一个字段的第一个字节"

但是查看http://www.lysator.liu.se/c/rat/c5.html上的"ANSI基本原理",它在第3.5.2.1节"结构和联合说明符"中指出"开头可能没有漏洞".所以我不确定"理由"是否具有确定性,但它似乎与那个非常明显的问题的那一部分相矛盾.

那么,这是什么? C结构的第一个字段是否始终保证偏移为0?

struct A
{
    int x;
};

struct B
{
    struct A myA;
    int y;
};

B myB;
Run Code Online (Sandbox Code Playgroud)

&myB 保证是同&(myB.myA)在一个可移植的方式?

(更具体地说,Libev中的libev用户数据技巧,如何将参数传递给相关的回调和许多其他地方确实假设结构中的第一个字段位于0的偏移处......是否真的可移植?)

c struct ansi libev

16
推荐指数
1
解决办法
1811
查看次数

为什么在宏定义中使用do {} while(0)?

可能重复:
为什么在C/C++宏中有时会出现无意义的do/while和if/else语句?

我遇到了如下代码:

#define ev_io_init(ev,cb,fd,events) \
do { \
  ev_init ((ev), (cb)); \
  ev_io_set ((ev),(fd),(events)); \
} while (0)
Run Code Online (Sandbox Code Playgroud)

我想知道作者为什么在do { } while (0)这里使用.这有什么不同吗?

#define ev_io_init(ev,cb,fd,events) { \
  ev_init ((ev), (cb)); \
  ev_io_set ((ev),(fd),(events)); \
}
Run Code Online (Sandbox Code Playgroud)

BTW:代码来自libev,ev_local.h

c c-preprocessor libev

15
推荐指数
3
解决办法
2万
查看次数

在Windows上的Libev

考虑libeventlibev.该libev库是否在Windows上具有IOCP的本机支持?

c++ windows libevent libev

7
推荐指数
2
解决办法
9763
查看次数

使用带有非阻塞套接字的libev,OpenSSL读取客户端证书错误

我花了一些时间搜索互联网寻找更好的方法来分析和调试我的问题,但我似乎无法找到解决方案.所以我想我会问.

简单地说.我正在尝试创建一个非阻塞的ssl转发代理.代理的服务器部分使用自签名服务器证书,我使用自己的CA证书签名.如果重要,我正在使用libev.我首先成功创建了一个非加密代理(它盲目地转发了网络流量),现在我正在尝试添加SSL.:)

我在让客户端连接到代理时遇到问题.我已经尝试过wget和ssl的s_client作为测试客户端,因为我想要进行一些自动化测试.

ssl服务器设置(此代码在EV_READ事件中从libev观察器侦听套接字accept_handler()调用):

/* setup client side ssl state (we are a SERVER) */
ctx = SSL_CTX_new(SSLv23_server_mode());
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLV2 | SSL_OP_ALL);
SSL_CTX_set_info_callback(ctx, client_info_cb);
SSL_CTX_set_cipher_list(ctx, "ALL:!SSLv2:-aNULL");
//SSL_CTX_load_verify_locations(ctx, CA_CERTIFICATE, NULL);
//SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(CA_CERTIFICATE));
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
SSL_CTX_set_verify_depth(ctx, 0);
SSL *client_ssl = SSN_new(ctx);
SSL_set_mode(client_ssl, SSL_MODE_ENABLE_PARTIAL_WRITE);
SSL_set_accept_state(client_ssl);
SSL_set_fd(client_ssl, client_fd);

/* initialize client handshake watchers */
ev_io_init(&ev_r_ch, client_handshake, client_fd, EV_READ);
ev_io_init(&ev_w_ch, client_handshake, client_fd, EV_WRITE);
... other watcher inits and set watcher data portions ...

/* start the read */
ev_io_start(loop, &ev_r_ch);
Run Code Online (Sandbox Code Playgroud)

libev循环设置为:

loop = ev_default_loop(EVFLAG_AUTO); …
Run Code Online (Sandbox Code Playgroud)

openssl libev

7
推荐指数
1
解决办法
1529
查看次数

使用具有多个线程的libev

我想使用具有多个线程的libev来处理tcp连接.我想要的是:

  1. 主线程侦听传入连接,接受连接并将连接转发到workerthread.

  2. 我有一堆workerthreads.线程数取决于cpu的数量.每个工作线程都有一个事件循环.工作线程监听我是否可以在tcp套接字上写入或者是否有可供阅读的东西.

我看着libev的文档,我知道这可以用libev做,但我找不到任何的例子,我怎么也得做.
有人有例子吗?我认为我必须使用ev_loop_new()api,对于worker-threads和主线程我必须使用ev_default_loop()?

问候

c++ multicore libev

6
推荐指数
2
解决办法
1万
查看次数

套接字文件描述符中的可读/可写是什么意思?为什么常规文件不打扰呢?

由于我最近刚开始学习 libev,因此io_watcher我不太了解a 中的可读/可写概念。据我所知,linux系统编程中有一个参数:

O_ASYNC

当指定的文件变得可读或可写时,将生成一个信号(默认为 SIGIO)。此标志仅适用于终端和套接字,不适用于常规文件。

那么,由于普通文件不会为可读/可写而烦恼,那么在套接字编程中可读/可写究竟意味着什么?内核采取了什么措施来确定套接字文件描述符是否可读?

考虑到一切皆文件的理念,是否每个具有不同描述符编号的套接字描述符实际上都指向同一个文件?如果是这样,我可以认为可读/可写问题是由同步引起的吗?

好吧,看来我问了一个愚蠢的问题。我真正的意思是套接字和常规文件都通过文件描述符进行读写,那么为什么套接字描述符有可读/可写的概念而常规文件没有。由于 EJP 告诉我这是因为缓冲区和每个描述符都有自己的一对缓冲区,这是我的结论:可读/可写的概念是针对缓冲区的,如果缓冲区为空,则它不可读,而它已满,则不可写。可读和可写与同步无关,并且由于常规文件没有缓冲区,因此它始终是可读和可写的。

还有更多的问题:在说接收缓冲区时,这个缓冲区不是同一个东西int recv(SOCKET socket, char FAR* buf, int len, int flags);,对吧?

c sockets linux libev

6
推荐指数
2
解决办法
3621
查看次数