使用 libevent 广播 TCP-Server

Posted

技术标签:

【中文标题】使用 libevent 广播 TCP-Server【英文标题】:Broadcast TCP-Server with libevent 【发布时间】:2011-06-29 18:39:52 【问题描述】:

我正在寻找一些简单的基于 libevent 的 TCP-Server 的示例代码,它将传入消息广播到所有连接的客户端。在网上我只找到了回显消息的 TCP-Servers。

本页底部有一个回显示例http://www.wangafu.net/~nickm/libevent-book/Ref8_listener.html

我确信更改本网站上提供的代码并不难,以便将消息广播到所有连接的客户端,但我不知道如何。

有人可以给我建议吗?

编辑:是的,某种聊天服务器。它接缝我需要这样做:

void server_read_cb(struct bufferevent *bev, void *data)

       struct evbuffer *input = bufferevent_get_input(bev);
       struct evbuffer *output = bufferevent_get_output(bev);

       char *mem = malloc(len); /* XXX: check for malloc failure */

       evbuffer_remove(input, mem, len);
       "for every connection conn" 
           /* XXX you'll need to implement a real connection list;
              the above isn't real C. */
               evbuffer_add(bufferevent_get_output(conn), mem, len);
       
       free(mem);

但我不能让它发挥作用。

【问题讨论】:

TCP-Server 是否在任何给定时间跟踪连接到它的所有打开的 TCP-Clients?我认为管理所有这些连接需要更多的资源,而不是简单地在“监听线”上广播消息。 通过查看您链接的示例代码,我服务器可以选择在建立连接时记录哪些设备正在监听它,然后将其删除只要在accept_error_cb 上收到错误,设备就会从侦听器列表中删除。 WangAFu 文章似乎将您寻求的特定实现留给了程序员 【参考方案1】:

您似乎想要类似于聊天服务器的东西。一个例子是here。基本上,当您从一个连接接收数据时,您只需浏览连接列表并将相同的数据发送给每个连接(包括/不包括原始连接)。

【讨论】:

以上是关于使用 libevent 广播 TCP-Server的主要内容,如果未能解决你的问题,请参考以下文章

如果我想要事件驱动服务器,该使用啥 libevent 或 libev?

Libevent库 编译与使用

使用 libevent 和 libev 提高网络应用性能

libevent库的使用

Libevent源码分析--- libevent事件机制

Libevent源码分析--- libevent事件机制