生活随笔
收集整理的這篇文章主要介紹了
用纯C面向过程写icefox3的代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
用純C面向過程寫icefox3的代碼 ? Xiaoxia[PG]
用純C面向過程寫icefox3的代碼 6月底在Ubuntu下寫了個框架,這幾天發現寫不下去了,又重新用Codelite組建了一次代碼。還是采用純C的代碼,和以前的一些代碼不同之處是,這次不打算使用面向對象的思想去指導我的代碼,取以代之的是馬列主義和思想。似乎覺得面向過程更適合使用異步的socket,所以這次也沒必要用到多線程編程了。
其實,我一直很贊成多線程編程在大多數時候能夠把很復雜的東西變得很簡單,只要能把資源管理好即可。而基于事件響應的編程通常連寫一個最簡單的ftp服務器程序都會變得異常復雜,尤其在使用非阻塞socket的時候。我所指的復雜和簡單是針對建模和代碼構建方面,而不是在代碼量上。閱讀一個多線程ftp服務器源代碼比一個單線程異步的ftp服務器源代碼要輕松得多。多線程的時候你只需要知道一個線程要做什么,其它的線程都是做相同的東西了。而且這些線程的工作都是有很嚴謹的執行順序,先做什么后做什么。但是單線程異步的時候情況就不同了,往往一個線程在處理一個連接請求的時候又突然進入了等待狀態,而緊接著又跑去了執行別的代碼,這樣一來你就不容易看出程序的執行次序和所做工作的流程圖。
之前一直想學會使用libevent,但下載了libevent的代碼之后,在跨平臺上做得還不盡人意。新的2.0版本才支持Windows的IOCP,但2.0似乎還未有穩定的版本可用。所以自己想了下還是用著POSIX socket就足夠了。
下面是事件相關的幾個函數: event.h
view plaincopy to clipboardprint?
int ?event_init();??int ?event_select();??int ?event_add(int ?fd,?event_handler?read_hdr,?event_handler?write_hdr);??void ?event_del(int ?fd,?int ?delread,?int ?delwrite);??int event_init();
int event_select();
int event_add(int fd, event_handler read_hdr, event_handler write_hdr);
void event_del(int fd, int delread, int delwrite);
處理事件的代碼:
view plaincopy to clipboardprint?
int ?event_select()??{?? ????int ?ret;?? ?? ????forever{?? ????????FD_ZERO(&fdreads);?? ????????FD_ZERO(&fdwrites);?? ?? ????????loop_search(&events,?0,?add_fd);?? ?? ????????ret?=?select(1024,?&fdreads,?&fdwrites,?NULL,?NULL);?? ????????DBG("ret=%d" ,?ret);?? ?? ????????switch (ret){?? ????????case ?-1:?? ?????????????? ????????????perror("select?failed" );?? ????????????break ;?? ????????case ?0:?? ?????????????? ????????????break ;?? ????????default :?? ?????????????? ????????????loop_search(&events,?0,?check_fd);?? ????????}?? ????}?? ?????? ????return ?0;?? }?? int event_select()
{int ret;forever{FD_ZERO(&fdreads);FD_ZERO(&fdwrites);loop_search(&events, 0, add_fd);ret = select(1024, &fdreads, &fdwrites, NULL, NULL);DBG("ret=%d", ret);switch(ret){case -1:/* here means some socket fds may be invalid. */perror("select failed");break;case 0:/* timeout */break;default:/* dispatch events */loop_search(&events, 0, check_fd);}}/* never reach here */return 0;
}
現在寫代碼都不怎么寫注釋了。我覺得自己代碼風格好,變量名函數名恰當,一般人都能看懂。有關鍵的地方或者值得得意的代碼才注釋一下。而且現在純C里喜歡用/* */來注釋代碼,主要是覺得美觀。看到一堆匈牙利命名法的C++代碼里又有一堆 // 的注釋符,就覺得不舒服。
以上僅個人見解。
總結
以上是生活随笔 為你收集整理的用纯C面向过程写icefox3的代码 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。