gpt4 book ai didi

linux - Linux 中的异步套接字——轮询与回调

转载 作者:IT王子 更新时间:2023-10-29 00:36:23 26 4
gpt4 key购买 nike

在决定在我的简单服务器 (linux) 中实现异步套接字时,我遇到了一个问题。我打算不断地轮询(),并在调用之间做一些清理和缓存。现在这看起来很浪费,所以我做了更多的挖掘并找到了一种可能在 i/o 上实现一些回调的方法。

如果我使用 O_NONBLOCK 创建一个套接字,使用 SIOCSPGRP ioctl() 在 i/o 上发送一个 SIGIO,并使用 sigaction() 定义一个回调函数我/我。

另外,是否可以为不同的套接字定义不同的功能?

最佳答案

“我打算不断地轮询 (),并在调用之间做一些清理和缓存。现在这看起来很浪费”

如何浪费?您真的尝试并实现了这个吗?

你有你的 fd 列表。你用列表调用 poll 或(更好的)epoll()。当它触发时,您遍历 fd 列表并适本地处理每一个。您需要缓存传入和传出数据,因此每个 fd 都需要某种结构。完成此操作后,我为 fd 结构使用了一个哈希表(从 fd 生成一个键),但你可能没问题,至少在最初,只是使用一个固定长度的数组并检查操作系统是否会向您发出异常高的 fd(注意,我从未见过这种情况,而且我眯着眼睛看的日志数量多得我数不过来)。这些结构包含指向传入和传出缓冲区的指针,可能是一个状态变量,例如:

struct connection {
int fd; // mandatory for the hash table version
unsigned char *dataOut;
unsigned char *dataIn;
int state; // probably from an enum
};

struct connection connected[1000]; // your array, or...

...可能链表实际上最适合 fd,我对哈希表有一个不相关的要求。

从那里开始逐步完善。我认为您只是想找到一个简单的出路——以后您可以通过让其他事情变得更难来为此付出代价 ;) 0.02 美元。

关于linux - Linux 中的异步套接字——轮询与回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10399665/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com