在决定在我的简单服务器(linux)中实现异步套接字时,我遇到了一个问题。我打算继续poll(),并在调用之间做一些清理和缓存。现在这看起来很浪费,所以我做了更多挖掘,找到了一种方法可能在i / o上实现一些回调。
如果我用O_NONBLOCK创建套接字,使用SIOCSPGRP ioctl()在i / o上发送SIGIO,并使用sigaction()来定义回调函数,那么我是否会产生性能损失,更重要的是它会工作吗? I / O。
另外,我可以为不同的套接字定义不同的功能吗?
答案 0 :(得分:3)
“我将继续轮询(),并在通话之间进行一些清理和缓存。现在这看起来很浪费”
浪费怎么样?你真的尝试过这个吗?你有你的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美元。