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