最近在研究IOCP,听说其在大规模socket连接上很有优势,但我试了一下怎么没感受出来呢,测试环境:Windows XP, CPU core(TM)2 Duo 1.60gHz
内存: 1.00GB, 开发环境VC6.0兄弟我采用IOCP如下应用
m_sSocket = socket(AF_INET, SOCK_STREAM, 0);
if (m_sSocket == INVALID_SOCKET)
return false;
//SOCKADDR_IN addr;
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//addr.sin_addr.S_un.S_addr = inet_addr(ip); if (bind(m_sSocket, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR)
return false; if (listen(m_sSocket, 10) == SOCKET_ERROR)
return false; if ((m_hIocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0)) == NULL) // 创建完成端口的句柄
return false; this->m_acceptThread = true;
g_haThread = CreateThread(NULL, 0, AcceptThread, (LPVOID)this, 0, &m_athreadID); // 创建连接线程,用来接收客户端的连接 this->m_workThread = true;
g_hwThread = CreateThread(NULL, 0, WorkThread, (LPVOID)this, 0, &m_wthreadID); // 创建工作线程,用来处理完成端口消息的
------------------------------------------------
在AcceptThread线程中用一个死循环不停的在等客户端连接
while(true)
{
client= accept(pthis->m_sSocket, NULL, NULL);
// 连接后处理
} =================================================================================================================
其下兄弟我又用经典的select模式来作对比实验
while(TRUE)
{
memcpy(&readfds, &fdCocpy, sizeof(fd_set));
int nSel = select(NULL, &readfds, NULL, NULL, NULL/*&SelectTime*/);
if(nSel > 0)
{
if(FD_ISSET(SvrSocket.m_sServer, &readfds))
{
SOCKET sClient = accept(SvrSocket.m_sServer, (struct sockaddr*)&sockinClient, &nSockinSize);
char* m_strClientIP = inet_ntoa(sockinClient.sin_addr);
int m_nClientPort = ntohs(sockinClient.sin_port);
i++;
printf("i=%d,Client :%d, IP= %s, port =%d \n",i, sClient, m_strClientIP, m_nClientPort);
FD_SET(sClient,&acceptfds);
}
} }
==============================================================================================
测得采用IOCP方式, 最大连接到16021,客户端就不能再连啦
采用Select模式,最大连接到16212,客户端不能再连接,以后进行的几次测试最大连接数都是维持在16000多,机器内存总消耗也就维持在40%左右,采用IOCP方式连接数反而都比经典的select的方式少一两百,不是说采用完成端口方式在大规模客户端连接方面很有优势吗,怎么没有体现出来呢,还是我的应用方式有什么不对的地方吗,请各位达人指教!
内存: 1.00GB, 开发环境VC6.0兄弟我采用IOCP如下应用
m_sSocket = socket(AF_INET, SOCK_STREAM, 0);
if (m_sSocket == INVALID_SOCKET)
return false;
//SOCKADDR_IN addr;
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//addr.sin_addr.S_un.S_addr = inet_addr(ip); if (bind(m_sSocket, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR)
return false; if (listen(m_sSocket, 10) == SOCKET_ERROR)
return false; if ((m_hIocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0)) == NULL) // 创建完成端口的句柄
return false; this->m_acceptThread = true;
g_haThread = CreateThread(NULL, 0, AcceptThread, (LPVOID)this, 0, &m_athreadID); // 创建连接线程,用来接收客户端的连接 this->m_workThread = true;
g_hwThread = CreateThread(NULL, 0, WorkThread, (LPVOID)this, 0, &m_wthreadID); // 创建工作线程,用来处理完成端口消息的
------------------------------------------------
在AcceptThread线程中用一个死循环不停的在等客户端连接
while(true)
{
client= accept(pthis->m_sSocket, NULL, NULL);
// 连接后处理
} =================================================================================================================
其下兄弟我又用经典的select模式来作对比实验
while(TRUE)
{
memcpy(&readfds, &fdCocpy, sizeof(fd_set));
int nSel = select(NULL, &readfds, NULL, NULL, NULL/*&SelectTime*/);
if(nSel > 0)
{
if(FD_ISSET(SvrSocket.m_sServer, &readfds))
{
SOCKET sClient = accept(SvrSocket.m_sServer, (struct sockaddr*)&sockinClient, &nSockinSize);
char* m_strClientIP = inet_ntoa(sockinClient.sin_addr);
int m_nClientPort = ntohs(sockinClient.sin_port);
i++;
printf("i=%d,Client :%d, IP= %s, port =%d \n",i, sClient, m_strClientIP, m_nClientPort);
FD_SET(sClient,&acceptfds);
}
} }
==============================================================================================
测得采用IOCP方式, 最大连接到16021,客户端就不能再连啦
采用Select模式,最大连接到16212,客户端不能再连接,以后进行的几次测试最大连接数都是维持在16000多,机器内存总消耗也就维持在40%左右,采用IOCP方式连接数反而都比经典的select的方式少一两百,不是说采用完成端口方式在大规模客户端连接方面很有优势吗,怎么没有体现出来呢,还是我的应用方式有什么不对的地方吗,请各位达人指教!
解决方案 »
- API函数ReadDirectoryChangesW漏掉信息的问题!~
- 一小问?
- 利用圆模板检测算子检测圆程序CPU占用100%的问题
- 求无闪烁自绘按钮例子
- 新手求救:一个简单的 全局变量位置 的问题?请指教
- 请教各位大虾文件读取问题,用ReadFile读文件内容到字符数组时,末尾总有其他字符
- 模态对话框中创建非模态对话框,怎样在前者中修改后者的CEdit控件文本?
- mfc如何在CStatic上动态生成一个控件
- 如何把一个button控件,设为disable,要用代码,不通过属性设定
- kernel32.dll中的RegisterServiceProcess()怎样调用?
- 关于组合框的问题。求助各位大虾
- ADO mysql-connector-odbc-5.1.0 内存泄漏
我看过一些资料,IOCP并不是连接数多,而是连接数多时消耗系统资源少,但是许多人反应这方面的优势不明显。