EPOLL模型
? 以前公司的服務器都是使用HTTP連接,但是這樣的話,在手機目前的網絡情況下不但顯得速度較慢,而且不穩定。因此大家一致同意用SOCKET來進行連 接。雖然使用SOCKET之后,對于用戶的費用可能會增加(由于是用了CMNET而非CMWAP),但是,秉著用戶體驗至上的原則,相信大家還是能夠接受 的(希望那些玩家月末收到帳單不后能夠保持克制...)。
? 這次的服務器設計中,最重要的一個突破,是使用了EPOLL模型,雖然對之也是一知半解,但是既然在各大PC網游中已經經過了如此嚴酷的考驗,相信他不會讓我們失望,使用后的結果,確實也是表現相當不錯。在這里,我還是主要大致介紹一下這個模型的結構。
名詞解釋:man epoll之后,得到如下結果:
NAME
?????? epoll - I/O event notification facility
SYNOPSIS
?????? #include
DESCRIPTION
?????? epoll is a variant of poll(2) that can be used either as Edge or Level
?????? Triggered interface and scales well to large numbers of? watched? fds.
?????? Three? system? calls? are provided to set up and control an epoll set:
?????? epoll_create(2), epoll_ctl(2), epoll_wait(2).
?????? An epoll set is connected to a file descriptor created? by? epoll_cre-
?????? ate(2).?? Interest for certain file descriptors is then registered via
?????? epoll_ctl(2).? Finally, the actual wait is started by epoll_wait(2).
其實,一切的解釋都是多余的,按照我目前的了解,EPOLL模型似乎只有一種格式,所以大家只要參考我下面的代碼,就能夠對EPOLL有所了解了,代碼的解釋都已經在注釋中:
while (TRUE)
?{
??int nfds = epoll_wait (m_epoll_fd, m_events, MAX_EVENTS, EPOLL_TIME_OUT);//等待EPOLL時間的發生,相當于監聽,至于相關的端口,需要在初始化EPOLL的時候綁定。
??if (nfds <= 0)
???continue;
??m_bOnTimeChecking = FALSE;
??G_CurTime = time(NULL);
??for (int i=0; i<nfds; i++)
??{
???try
???{
????if (m_events[i].data.fd == m_listen_http_fd)//如果新監測到一個HTTP用戶連接到綁定的HTTP端口,建立新的連接。由于我們新采用了SOCKET連接,所以基本沒用。
????{
?????OnAcceptHttpEpoll ();
????}
????else if (m_events[i].data.fd == m_listen_sock_fd)//如果新監測到一個SOCKET用戶連接到了綁定的SOCKET端口,建立新的連接。
????{
?????OnAcceptSockEpoll ();
????}
????else if (m_events[i].events & EPOLLIN)//如果是已經連接的用戶,并且收到數據,那么進行讀入。
????{
?????OnReadEpoll (i);
????}
????OnWriteEpoll (i);//查看當前的活動連接是否有需要寫出的數據。
???}
???catch (int)
???{
????PRINTF ("CATCH捕獲錯誤\n");
????continue;
???}
??}
??m_bOnTimeChecking = TRUE;
??OnTimer ();//進行一些定時的操作,主要就是刪除一些短線用戶等。
?}
其實EPOLL的精華,按照我目前的理解,也就是上述的幾段短短的代碼,看來時代真的不同了,以前如何接受大量用戶連接的問題,現在卻被如此輕松的搞定,真是讓人不得不感嘆。
總結
- 上一篇: VC中Error spawning cl
- 下一篇: ssr 失败