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_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++代码里又有一堆 // 的注释符,就觉得不舒服。
以上仅个人见解。
沙发,期待fox3
以上仅个人见解
我一般是写代码的时候写注释, 等到成形以后, 代码自身就能说明一切了, 就把多余的注释删掉
我觉得我能够无障碍地读懂我没写注释的代码
写代码时注释,写完后删掉好像不大符合你的作风。。。
我也是使用/**/注释的,不过经常遇到一个麻烦的问题就是,不能嵌套,有时候需要大片注释代码的时候,代码里面又包含/**/的时候,就不好使了。
另外,个人感觉面向对象思路虽然很适合表达人的逻辑思维,但是往往却把简单的问题复杂化。
– -个人见解
大多数情况下用得恰当,是可以把复杂问题简单化的,要不然也没人用。但是我觉得代码实现起来会有点复杂,代码量大。
我比较喜欢C,又喜欢面向对象,所以我喜欢 GLib,你可以试试哦。
哈哈,俺发现俺和小虾大牛意见一致!洗屁屁什么的最讨厌了。
忘了看哪说的了,推荐函数名以动词开头,不过俺还是喜欢反过来,就像小虾的这个event_select。
其实,我是没有文档去写代码的。平时老是找不到某函数在哪个文件,于是用了这一招:外部函数的第一个单词表示文件名,后面的单词才表示具体工作。。。经验说明,做法很不错!
GTK里的灵感?
还没些好呢!!!工程量太大了。
有空的话我会用python试试看看能不能把icefox3写出来。