生活随笔
收集整理的這篇文章主要介紹了
用纯C面向过程写icefox3的代码
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
用純C面向過程寫icefox3的代碼 ? Xiaoxia[PG]
用純C面向過程寫icefox3的代碼 6月底在Ubuntu下寫了個(gè)框架,這幾天發(fā)現(xiàn)寫不下去了,又重新用Codelite組建了一次代碼。還是采用純C的代碼,和以前的一些代碼不同之處是,這次不打算使用面向?qū)ο蟮乃枷肴ブ笇?dǎo)我的代碼,取以代之的是馬列主義和思想。似乎覺得面向過程更適合使用異步的socket,所以這次也沒必要用到多線程編程了。
其實(shí),我一直很贊成多線程編程在大多數(shù)時(shí)候能夠把很復(fù)雜的東西變得很簡單,只要能把資源管理好即可。而基于事件響應(yīng)的編程通常連寫一個(gè)最簡單的ftp服務(wù)器程序都會(huì)變得異常復(fù)雜,尤其在使用非阻塞socket的時(shí)候。我所指的復(fù)雜和簡單是針對建模和代碼構(gòu)建方面,而不是在代碼量上。閱讀一個(gè)多線程ftp服務(wù)器源代碼比一個(gè)單線程異步的ftp服務(wù)器源代碼要輕松得多。多線程的時(shí)候你只需要知道一個(gè)線程要做什么,其它的線程都是做相同的東西了。而且這些線程的工作都是有很嚴(yán)謹(jǐn)?shù)膱?zhí)行順序,先做什么后做什么。但是單線程異步的時(shí)候情況就不同了,往往一個(gè)線程在處理一個(gè)連接請求的時(shí)候又突然進(jìn)入了等待狀態(tài),而緊接著又跑去了執(zhí)行別的代碼,這樣一來你就不容易看出程序的執(zhí)行次序和所做工作的流程圖。
之前一直想學(xué)會(huì)使用libevent,但下載了libevent的代碼之后,在跨平臺上做得還不盡人意。新的2.0版本才支持Windows的IOCP,但2.0似乎還未有穩(wěn)定的版本可用。所以自己想了下還是用著POSIX socket就足夠了。
下面是事件相關(guān)的幾個(gè)函數(shù): 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;
}
現(xiàn)在寫代碼都不怎么寫注釋了。我覺得自己代碼風(fēng)格好,變量名函數(shù)名恰當(dāng),一般人都能看懂。有關(guān)鍵的地方或者值得得意的代碼才注釋一下。而且現(xiàn)在純C里喜歡用/* */來注釋代碼,主要是覺得美觀。看到一堆匈牙利命名法的C++代碼里又有一堆 // 的注釋符,就覺得不舒服。
以上僅個(gè)人見解。
總結(jié)
以上是生活随笔 為你收集整理的用纯C面向过程写icefox3的代码 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。