iocp中工作线程这一个概念, 我翻看了不少资料,还有一些开源的iocp类,工作线程函数代码,都是同一个线程函数!!!
我很奇怪,为什么工作线程的代码是一样的?比如:我已经有个需求,服务器需要开辟3个工作线程,一个应付文字传输,一个应付udp语音,
一个应付文件传输。 自然 3个线程的代码是不一样的。
而不少开源的iocp类,作者在封装的时候,他们的工作线程函数代码都是一致的。然后留几个虚函数或者回调函数,让调用者自己实现。
我提供一个例子,这是王艳萍的书上的一个例子,叫CIOCPServer(网上也广泛流传着CIOCPServer)////////////////////////////////////////////////////////////////////////////////////
代码的大概思路: 注意HandleIO 和那几个虚函数 ,HandleIO是由线程函数_WorkerThreadPorc调用!!!!而虚函数则是被HandleIO调用!!!
class CIOCPServer // 处理线程
{
public:
.....................
protected:
........................................
void HandleIO(DWORD dwKey, CIOCPBuffer *pBuffer, DWORD dwTrans, int nError); //回调
// 事件通知函数
// 建立了一个新的连接
virtual void OnConnectionEstablished(CIOCPContext *pContext, CIOCPBuffer *pBuffer);
// 一个连接关闭
virtual void OnConnectionClosing(CIOCPContext *pContext, CIOCPBuffer *pBuffer);
// 在一个连接上发生了错误
virtual void OnConnectionError(CIOCPContext *pContext, CIOCPBuffer *pBuffer, int nError);
// 一个连接上的读操作完成
virtual void OnReadCompleted(CIOCPContext *pContext, CIOCPBuffer *pBuffer);
// 一个连接上的写操作完成
virtual void OnWriteCompleted(CIOCPContext *pContext, CIOCPBuffer *pBuffer);
private: // 线程函数
static DWORD WINAPI _ListenThreadProc(LPVOID lpParam);
static DWORD WINAPI _WorkerThreadProc(LPVOID lpParam);
};
提供一个测试代码:
class CMyServer : public CIOCPServer
{
public: void OnConnectionEstablished(CIOCPContext *pContext, CIOCPBuffer *pBuffer)
{
printf(" 接收到一个新的连接(%d): %s \n",
GetCurrentConnection(), ::inet_ntoa(pContext->addrRemote.sin_addr)); SendText(pContext, pBuffer->buff, pBuffer->nLen);
} .......................
};这种封装,似乎和我的需求冲突啊,我需要的是 3个线程,3个线程函数,而不是一个线程函数!!!而且HandleIO他都已经写好了。 线程函数中调用HandleIO.有人或许会说,你再换一个开源的 iocp不久可以了嘛? 我却是找了不少,发现,封装者差不多都是如此封装的。那么反推,我的设计有问题了!!!!(服务器打算用iocp模型, 可以中转语音,文字, 文件,我最初是想用3个线程,3个线程函数分别实现)如何 采用这些开源iocp来,来解决我的设计呢?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货