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

标签 linux sockets asynchronous callback ioctl

在决定在我的简单服务器 (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/

相关文章:

c - 使用 select() 时 send() 会阻塞吗?

javascript - yepnope js 测试对象如何工作?

linux - 如何调试 tokio 任务挂起的位置?

c# - 在什么情况下 TaskCompletionSource.SetResult() 会同步运行延续?

linux - 编译后使用 gedit 打开 C 文件时出现意外警告

linux - 为什么 grep 搜索 '0,^M$' 返回空行?

c# - 在 Unity3D 中使用 Windows.Networking.Sockets

linux - 命令在命令行和脚本文件中产生不同的结果

linux - * NIX GUI如何工作?

java - 在java中将套接字消息打印到控制台