在决定在我的简单服务器(linux)中实现异步套接字时,我遇到了一个问题。我打算不断地 poll(),并在调用之间进行一些清理和缓存。现在这似乎很浪费,所以我做了更多的挖掘并找到了一种可能在 i/o 上实现一些回调的方法。
如果我使用 O_NONBLOCK 创建一个套接字,使用 SIOCSPGRP ioctl() 在 i/o 上发送 SIGIO,并使用 sigaction() 在 i/o 期间定义回调函数,我会招致性能损失吗? .
另外,我可以为不同的socket定义不同的功能吗?
在决定在我的简单服务器(linux)中实现异步套接字时,我遇到了一个问题。我打算不断地 poll(),并在调用之间进行一些清理和缓存。现在这似乎很浪费,所以我做了更多的挖掘并找到了一种可能在 i/o 上实现一些回调的方法。
如果我使用 O_NONBLOCK 创建一个套接字,使用 SIOCSPGRP ioctl() 在 i/o 上发送 SIGIO,并使用 sigaction() 在 i/o 期间定义回调函数,我会招致性能损失吗? .
另外,我可以为不同的socket定义不同的功能吗?
“我打算不断轮询(),并在调用之间进行一些清理和缓存。现在这似乎很浪费”
怎么浪费?您是否真的尝试过实现这一点?
你有你的 fd 列表。您使用列表调用 poll 或(更好)epoll()
。当它触发时,你遍历 fd 列表并适当地处理每一个。您需要缓存传入和传出数据,因此每个 fd 都需要某种结构。完成此操作后,我为 fd 结构使用了哈希表(从 fd 生成密钥),但您可能没问题,至少在最初,只需使用固定长度数组并检查操作系统是否有问题你是一个奇怪的高fd(nb,我从来没有见过这种情况发生,我眯着眼睛看的日志比我能数的要多)。这些结构包含指向传入和传出缓冲区的指针,可能是一个状态变量,例如:
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美元。