Linux中的异步套接字-通过以下方式轮询与回调

Jon*_*don 5 sockets linux asynchronous ioctl callback

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

如果我使用O_NONBLOCK创建了套接字,请使用SIOCSPGRP ioctl()在I / O上发送SIGIO,并使用sigaction()在I / O期间定义回调函数,是否会导致性能下降,更重要的是,它将起作用吗? 。

另外,我可以为不同的插座定义不同的功能吗?

del*_*ver 3

“我本来打算不断地 poll(),并在调用之间进行一些清理和缓存。现在这似乎很浪费”

浪费怎么办?你真的尝试过并实现这个吗?

你有你的 fd 列表。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...
Run Code Online (Sandbox Code Playgroud)

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

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