仅是笔记,存在错误,并未写完,请勿阅读,谢谢
1、CGh0stApp–>Initlnstance()
1)配置界面信息及其他
2)从.ini文件中读取监听端口ListenPort和最大连接数MaxConnection,并做相应的调整
3)调用((CMainFrame*) m_pMainWnd)->Activate(nPort, nMaxConnection)去激活服务器,(跳到2)
2、CMainFrame–>Activate(UINT nPort, UINT nMaxConnections)
0)1来
1)检查是否存在m_iocpServer,如果有的话,shutdown一下
(程序刚启动,一般是没有,这里停一下,不跟进,跟进到13)
2)m_iocpServer新建对象,调用CIOCPServer的构造函数(跟进,到3)
3)开启服务器,调用函数
m_iocpServer->Initialize(NotifyProc, this, 100000, nPort)(跟进到4)
4)获得主机名,通过主机名获得ip,并设置状态栏显示数据
5)返回到1
3、CIOCPServer–>CIOCPServer()
0)2来
1)初始化套接字版本wsaData
2)初始化一个临界区变量m_cs
3)初始化15个iocpserver的变量,
4)定义包标志bPacketFlag
5)返回到2
4、CIOCPServer–>Initialize(NotifyProc, this, 100000, nPort)
0)2来
1)存下三个参数
2)创建套接口m_socListen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
3)创建网络事件m_hEvent = WSACreateEvent()
4)将FD_ACCEPT事件关联到套接口上
nRet = WSAEventSelect(m_socListen,m_hEvent,FD_ACCEPT);
5)配置SOCKADDR_IN地址
6)绑定套接头nRet = bind(m_socListen,(LPSOCKADDR)&saServer,sizeof(struct sockaddr));
7)监听端口nRet = listen(m_socListen, SOMAXCONN);
8)开启监听线程
m_hThread =(HANDLE)_beginthreadex(NULL,0,ListenThreadProc,(void*) this,0,&dwThreadId);
9)跟进看一下这个监听线程都干了啥(跟进到5)
A)初始化完成端口InitializeIOCP();(MD,数字太多,把我弄混了,居然把这个给漏了)(跳到20)
B)返回2
5、CIOCPServer.–>ListenThreadProc(LPVOID lParam)
0)4来
1)无限while循环
2)等待m_hKillEvent受信就跳出循环
WaitForSingleObject(pThis->m_hKillEvent, 100) == WAIT_OBJECT_0
3)插一句,受信是在CIOCPServer::stop中SetEvent(m_hKillEvent),
就是在stop掉server的时候受信
4)等待事件的发生,没有发生就阻塞在这里
dwRet = WSAWaitForMultipleEvents(1,&pThis->m_hEvent,FALSE,100,FALSE);
5)如果超时,继续while循环
6)查看事件是什么事件
int nRet = WSAEnumNetworkEvents(pThis->m_socListen,pThis->m_hEvent,&events);
7)如果error的话就跳出while循环
8)如果事件是FD_ACCEPT的话,表示有连接到来调用CIOCPSserver::OnAccept()(跟进到6)