用纯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?
  1. int event_init();
  2. int event_select();
  3. int event_add(int fd, event_handler read_hdr, event_handler write_hdr);
  4. 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?
  1. int event_select()
  2. {
  3. int ret;
  4. forever{
  5. FD_ZERO(&fdreads);
  6. FD_ZERO(&fdwrites);
  7. loop_search(&events, 0, add_fd);
  8. ret = select(1024, &fdreads, &fdwrites, NULL, NULL);
  9. DBG("ret=%d", ret);
  10. switch(ret){
  11. case -1:
  12. /* here means some socket fds may be invalid. */
  13. perror("select failed");
  14. break;
  15. case 0:
  16. /* timeout */
  17. break;
  18. default:
  19. /* dispatch events */
  20. loop_search(&events, 0, check_fd);
  21. }
  22. }
  23. /* never reach here */
  24. return 0;
  25. }
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的代码相关推荐

  1. javascript用面向过程写贪吃蛇游戏

    下面是HTML与CSS的代码 CSS: <style>*{margin: 0;padding: 0;}body {background-color: white;}.face {posit ...

  2. 基于面向过程写的七星彩票购买系统

    自主设计七星彩彩票购买系统如下 界面如下: (0-9) 选择7个数 可以重复 欢迎来到彩票购买系统v1.0:(适当研究下七星彩的玩法) 1.购买彩票 2.查看开奖 连续2个号码一致 六等奖 连续3个号 ...

  3. 关于面向过程和面向对象的理解

    要搞清楚面向过程和面向对象,必须搞清楚以下3点: 1.么是面向过程的程序设计思想 2.面向过程的程序设计思想编写程序时有什么问题? 3.为解决面向过程思想中的致命缺陷,于是C语言引入了封装类,进入了面 ...

  4. 面向过程(POP)与面向对象(OOP)

    面向过程(POP)与面向对象(OOP) 面向对象编程(Object Oriented Programing)简写为OOP 面向过程 (Procedure Oriented Programing) 简写 ...

  5. PHP面向对象和面向过程

    php面向对象 和 面向过程 1.面向过程 一件一件罗列 自顶向下,逐步细化 2.面向对象 四大基本特征 1.抽象: 现实世界中的关键特性去为抽象搭建一个模型 抽象模型:属性(数据) 操作(行为) 2 ...

  6. java面向过程开发,刚接触java的体验

    1.理解面向过程和面向对象的概念以及区别: 2.掌握如何在需求中提取对象,会使用Java代码描述提取的对象: 3.了解对象在内存中的存在状态 4.理解类和对象的区别 5.掌握局部变量和成员变量的概念和 ...

  7. 面向对象和面向过程的区别[个人见解]

    查阅得到的资料: 面向过程"(Procedure Oriented)是一种以过程为中心的编程思想. 面向对象程序设计以对象为核心,该方法认为程序由一系列对象组成. 面向过程:注重做的步骤和过 ...

  8. 面向对象 - 1.面向过程/2.面向对象/3.如何使用类/4.__init__方法/5.属性查找/6.补充知识/7.可扩展性高...

    编程范式(流派): 面向对象编程,面向过程编程 各有用处!! 编程:语法+数据结构(list dict)+算法(逻辑)-----------------------------------1.面向过程 ...

  9. 编程思想:面向对象和面向过程的区别与联系

    前言 何谓面向对象?何谓面向过程?对于这编程界的两大思想,一直贯穿在我们学习和工作当中.我们知道面向过程和面向对象,但要让我们讲出来个所以然,又感觉是不知从何说起.而这种茫然,其实就是对这两大编程思想 ...

最新文章

  1. 用Remoting 实现一个文件传输组件
  2. 数据库自动收缩带来的严重问题
  3. DeepFaceLab 换脸
  4. mysql会话命令_mysql常用命令(持续更新)
  5. Linux Vi 删除全部内容,删除某行到结尾,删除某段内容 的方法
  6. Mathematica函数大全
  7. requirejs插件-domReady插件
  8. Enterprise Library 4.1学习笔记3----安全应用程序块
  9. 基姆拉尔森计算公式(算任意日期是星期几)
  10. JavaScript基础和记背内容 Day1
  11. 使用 Vite + 前端框架 (SolidJs,React,Svelte,Vue) 来开发 油猴脚本
  12. 安卓微信支付回调出现白页面
  13. Python 利用内置函数把二进制小数转换为十进制
  14. 博朗x乐高全球限量型趣宝盒首发
  15. 04-MPI几个基本函数
  16. 笔记本连接WiFi后浏览器不能上网,但是连接手机热点就可以。问题解决!!!
  17. python数据可视化字段,Python数据可视化
  18. Vue3前后端交互错误处理一致性
  19. 第九章:项目资源管理 - (9.4 建设团队)
  20. SQL必知必会1 查询部分 P1-P129

热门文章

  1. 《京东技术解密》读书笔记:坚持技术十年如一日
  2. 力扣——按递增顺序显示卡牌
  3. Lesson 008 —— python 初识
  4. java 12-3 StringBuffer的添加和删除功能
  5. 计算器是如何计算sin、cos等科学函数的值呢?
  6. [转]SAP FI/CO 模块设置
  7. php 自定义文件后缀,自定义更改服务器asp/php/.net等文件后缀名
  8. java示例_Java入门示例
  9. 【STM32】无线通信实验代码详解
  10. Ubuntu apt-get 源详解