首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

IOCP基础有关问题,

2012-11-03 
IOCP基础问题,在线等?服务器端:在后台线程处理完数据后,需要使用wsasend()传输到用户端,我知道有2种方式1、

IOCP基础问题,在线等?
服务器端:
在后台线程处理完数据后,需要使用wsasend()传输到用户端,我知道有2种方式
1、新开线程在线程里使用wsasend()发送数据,在工作线程里判断传输结果(XXX字节被发送)
2、将请求提交给工作线程,使用工作线程中的wsasend()发送数据

问题1:向用户端发送一个数据包后,用户端的应答是否要预先制定一套机制,比如:返回OK,继续发送包,返回error,重复发包(我认为不应该是这样的),还是使用正常的TCP通讯的默认方式即可完成双发的应答式通讯(我觉得应该是这样的)?
问题2:后台数据处理线程如何向工作线程发出一个向用户端传输数据的请求,是使用PostQueuedCompletionStatus吗?还有没有其他的方式?
问题3:在下面的代码的AAAAA处,服务器向用户端发送数据,这里有这样的一个情况:
假如服务器端的业务线程同时处理完100个用户的请求,为每个用户都生成了1G的数据量,这些数据不能同时放入内存,假设每个用户可用内存为10M,我把10M数据放入内存,交给IOCP,他发送出10M数据后,必然是认为所有数据发送结束了,那么剩下的数据如何投到IOCP中去,或者说服务器方要海量向用户端传输数据,在不能全部缓冲的情况下,如何处理?



DWORD WINAPI CIOCPModel::_WorkerThread(LPVOID lpParam)
{  
BOOL bReturn = GetQueuedCompletionStatus(...);
......
case RECV_POSTED:
{

}
case SEND_POSTED:
{
  AAAAA
  这里循环发送10M后,IOCP没活了
  for(10M--)
  wsasend();
}
break;
......
return 0;
}

[解决办法]
我写过一个IOCP聊天室,对问题2我是这么干的,我维持了一个全局的数据包链表,如果链表为空则只保留后台纤程,否则新开线程,线程数不多于CPU数量乘以二

C/C++ code
//////////////////////////////////////////////////////////////////////////        // TODO:这里添加更多自定义代码,有一个用户连上了        if (m_dwNowThreads < m_dwMaxThreads)        {            for (int i = 0; i < m_dwMaxThreads; i++)            {                DWORD dwExitCode = 0;                GetExitCodeThread(m_pThreadPool[i], &dwExitCode);                                if (dwExitCode != STILL_ACTIVE)                {                    CloseHandle(m_pThreadPool[i]);                    InterlockedExchangeAdd((PLONG)&m_dwNowThreads, 1);                    m_pThreadPool[i] = BEGINTHREAD(ServiceThreadProc, NULL);                    cout << "Now threads: " << m_dwNowThreads << endl;                    break;                }            }        } 

热点排行