我有一个用 libevent 编码的 TCP-Brodcast-Server,它执行以下操作:
Read data from a client
...
Transform the data
...
//Write data to all connected clients
for (int i = 0; i< connected clients; i++){
// write Syscall for every client
write(clientfd[i], "Transformed Data", lenofdata)
}
现在我想提高性能并减少系统调用的数量。我不想以顺序方式将转换后的数据写入每个套接字并在每次写入套接字时进行系统调用,我想只使用一个系统调用将数据写入所有连接的客户端,如下所示:
Read data from a client
...
Transform the data
...
// one single write Syscall for all connected clients
write(arrayWithManyClientFds, "Transformed Data", lenofdata)
那可能吗?
编辑:最初我虽然发现了一个名为 lio_listio 的系统调用,这里将其描述为一个“重要的函数,因为这意味着您可以在单个系统调用的上下文中启动大量 I/O(意味着一个内核上下文切换)。 "
不幸的是 lio_listio() 接缝不适用于套接字,因为它在此处说明:“AIO 在套接字上读写 [不支持](不返回显式错误,但默认为同步或非 AIO 行为) "
所以我仍在寻找解决方案,如果有的话!