linux中的socket回调

Posted

技术标签:

【中文标题】linux中的socket回调【英文标题】:Callback on sockets in linux 【发布时间】:2013-07-29 14:12:12 【问题描述】:

有没有办法在 Linux 中将回调函数与套接字关联起来?

例如, 在 connect(s, (struct sockaddr *)peeraddr, sizeof(*peeraddr)) 函数已将客户端与服务器连接后,有没有办法将函数 afterRecv 与 socket- s 相关联,以便在 recv 函数从套接字读取一些数据之后, afterRecv 被调用?

我的套接字是阻塞类型的。这种要求背后的原因是,我正在使用 OpenSSL,它在内部握手期间对套接字进行许多发送/接收调用。如果我修改 OpenSSL,那么修改每一个 recv 会很麻烦。所以我在想我是否可以添加回调来简化我的工作。

流程应该是:

    套接字连接逻辑

    接收函数

    recv 读取数据后,afterRecv 被调用为 recv 上的回调

【问题讨论】:

当您似乎计划重新编译 OpenSSL 的源代码时,将 recv() 替换为您自己的版本(环绕原来的 recv())就可以了,不是吗? @alk 是的,这似乎是一个不错的选择。 如果您愿意使用 C++,boost ASIO 库对事件驱动的 I/O 和 SSL 提供了出色的支持。 【参考方案1】:

一些事件库实现了这样的回调钩子:

libev libevent

所有图形或 HTTP 服务器库(例如 Gtk/Glib、Qt、LibOnion、...)都提供(或使用)此类事件库(围绕多路复用系统调用,如 poll(2) 等)。

Glib(来自 GTK)和 QtCore(来自 Qt)都是无需任何 GUI 即可使用的事件库

另请阅读C10K problem

【讨论】:

以上是关于linux中的socket回调的主要内容,如果未能解决你的问题,请参考以下文章

Android socket.IO中的Emit或Ack超时处理?

Nest.js 中的 Socket.io 确认

Linux 中的异步套接字——轮询与回调通过

arm开发板上的linux如何通过网口和windows的网口通信,linux中的socket和windows下的socket能通用吗?

Linux 中的 web_sockets 等价物在哪里?

linux 中 C++ 中的 UDP Socket 编程