用纯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
- 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);
处理事件的代码:
- 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;
- }
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++代码里又有一堆 // 的注释符,就觉得不舒服。
以上仅个人见解。