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超时处理?
arm开发板上的linux如何通过网口和windows的网口通信,linux中的socket和windows下的socket能通用吗?