摘要:
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件) 4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息。(生成.exe文件) 编译器在编译时是以C文件为单位进行的,也就是说如果你的项目中一个C文件都没有,那么你的项目将无法编译,连接器是以目标文件为单位,它将一个或多. 阅读全文
摘要:
C语言提供一种特殊的运算符——逗号运算符。用它将两个表达式连接起来。如: 3+5,6+8称为逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为 表达式1,表达式2逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。例如,上面的逗号表达式“3+5,6+8”的值为14。又如,逗号表达式 a=3*5,a*4对此表达式的求解,读者可能会有两种不同的理解:一种认为“3*5,a*4” 是一个逗号表达式,先求出此逗号表达式的值, 如果a的原值为3,则逗号表达式的值为12,将12赋给a, 因此最后a的值为12。另一种认为:“a=3*5”是一个赋值表达式”,“a. 阅读全文
摘要:
struct sockaddr { unsigned short sa_family; /* 地址族, AF_xxx */ char sa_data[14]; /* 14字节的协议地址*/ }; 上面是通用的socket地址,具体到Internet socket,用下面的结构,二者可以进行类型转换 struct sockaddr_in { short int sin_family; /* 地址族,AF_xxx 在socket编程中只能是AF_INET */ unsigned short int sin_port; /* 端口号 (使用网络字节顺序) */ struct in_addr sin_ 阅读全文
摘要:
gethostbyname和gethostbyaddr这两个函数仅仅支持IPv4,getaddrinfo函数能够处理名字到地址以及服务到端口这两 种转换,返回的是一个sockaddr结构的链表而不是一个地址清单。这些sockaddr结构随后可由套接口函数直接使用。如此以 来,getaddrinfo函数把协议相关性安全隐藏在这个库函数内部。应用程序只要处理由getaddrinfo函数填写的套接口地址结构。该函数在 POSIX规范中定义了。#include<netdb.h>int getaddrinfo( const char *hostname, const char *servic 阅读全文
摘要:
循环链表的运算与单链表的运算基本一致,所不同的有以下几点:(1)在建立一个循环链表时,必须使其最后一个节点的指针指向表头节点,而不是像单链表那样置为NULL。此种情况适用于在最后一个节点后插入一个新节点。(2)判断是否到表尾采用判断该节点链域的值是否是表头节点的方法,当链域值等于表头指针时,说明已到表尾,而不是像单链表那样判断链域值是否为NULL。 约瑟夫问题:编号为1~N的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数),开始人选一个正整数作为报数上限值M,从第一个人按顺时针方向自1开始顺序报数,报道M时停止报数。报M的人出列,将他的密码作为新的M值,从他顺时针方向上的下一个人开始从1 阅读全文
摘要:
转自:http://book.51cto.com/art/200811/96138.htm在任何程序设计环境及语言中,内存管理都十分重要。在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的。因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题。第1节主要介绍内存管理基本概念,重点介绍C程序中内存的分配,以及C语言编译后的可执行程序的存储结构和运行结构,同时还介绍了堆空间和栈空间的用途及区别。第2节主要介绍C语言中内存分配及释放函数、函数的功能,以及如何调用这些函数申请/释放内存空间及其注意事项。第3节主要介绍了在Linux下除GDB之外的内存调试及管理工具,包括glibc提供的内存管 阅读全文
摘要:
一、什么是BitTorrent 一般来说,我们认为BitTorrent是一个P2P下载软件(点对点下载软件),你在下载的同时,也在为其他用户提供该文件的上传,因为大家是“互相帮助”,所以不会随着用户数的增加产生服务器拥塞而降低下载速度。 但是严格的来说,BitTorrent是一种用来在网络上传输文件的协议(Protocol),它本质上是分布式系统的P2P(点对点)传输文件协议,用户直接相连,然后互相发送和接收文件的各部分,BitTorrent仍然有一个中心服务器(Tracker)(此处的服务器不是指实体的服务器,只是表示提供服务的服务者)来协调各个用户之间的协作。Tracker服务器只是管理连 阅读全文
摘要:
如果你正在读这篇文章,那么很可能你花费了很多时间在网上。然而,考虑到互联网在我们日常生活中的影响,又有多少人了解互联网是如何起家的呢?下面是互联网的一个简史,包括重要的日期、人物、项目、网站以及其它可以让你至少明白我们现在称作互联网的到底是什么或者是从那里来的。由于互联网完整的历史需要几本书来写,这篇文章只是让你熟悉在1969-2009年期间互联网的里程碑和给互联网带来变革和进步的事件。1969:阿帕网(Arpanet )阿帕网是第一个使用包交换技术(当时来说,这是一项新技术)的真实网络。1969年10月29日,斯坦福大学和加州大学洛杉矶分校的计算机首次连接了起来。实际上,他们是未来互联网的第 阅读全文
摘要:
在2009年我PPT做的比较多,有技术解决方案的,项目管理的,汇报的,个人知识管理和项目管理的等。对于PPT制作最近在重读《金字塔原理》,结合我是如此思考的一些思路来对PPT制作重新思考如下:第一步:通过破题搞清楚PPT内容定位和目标 一个PPT要聚焦,要能够体现你需要传达的核心目标和主题。这是PPT制作的关键,而这个工作最重要的就是要破题,不破不立,破题的重点可以从如下几个方面进行思考。我期望传达的核心思想是什么?你的听众是谁?听众最期望得到什么?PPT讲完后你期望达到一个什么效果? 综合上面的描述就是需要去匹配你的期望和听众的期望,让这两者达到一致,所以在制作PPT的时候你随时都要考虑去解 阅读全文
摘要:
我们经常会听到这样的说法,不懂得函数指针就不是真正的C语言高手。我们不管这句话对与否,但是它都从侧面反应出了函数指针的重要性,所以我们还是有必要掌握对函数指针的使用。先来看看函数指针的定义吧。 函数是由执行语句组成的指令序列或者代码,这些代码的有序集合根据其大小被分配到一定的内存空间中,这一片内存空间的起始地址就成为函数的地址,不同的函数有不同的函数地址,编译器通过函数名来索引函数的入口地址,为了方便操作类型属性相同的函数,c/c++引入了函数指针,函数指针就是指向代码入口地址的指针,是指向函数的指针变量。 因而“函数指针”本身首先应该是指针变量,只不过该指针变量指向函数。这正如用指针变量可指 阅读全文
摘要:
realloc()函数原型:extern void *realloc(void *mem_address, unsigned int newsize);语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。 头文件:#include <stdlib.h> 有些编译器需要#include <alloc.h>,在TC2.0中可以使用alloc.h头文件 功能:先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域,同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。 阅读全文
摘要:
最近在写source code时需要在数组的buffer小时重新申请一块buffer,故找了一些资料,乖乖,竟然原指针还可以“漂移”。。。。。。realloc 原型:extern void *realloc(void *mem_address, unsigned int newsize); 用法:#include <stdlib.h> 有些编译器需要#include <alloc.h> 功能:改变mem_address所指内存区域的大小为newsize长度。 说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 当内存不再使用时,应使用free() 阅读全文
摘要:
int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。该函数的第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用程序要发送数据的缓冲区;第三个参数指明实际要发送的数据的字节数;第四个参数一般置0。这里只描述同步Socket的send函数的执行流程。当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的 长度,如果len大于s的 阅读全文
摘要:
图片可以在下面的博客中看到.转自:http://blog.csdn.net/bigloomy/article/details/6633008可能有不少读者会问,字节对齐有必要拿出来单独写一篇博客嘛?我觉得是很有必要,但是它却是被很多人所忽视的一个重点。那么我们使用字节对齐的作用和原因是什么呢?由于硬件平台之间对存储空间的处理上是有很大不同的,一些平台对某些特定类型的数据只能从某些特定地址开始存取,如通常有些架构的CPU要求在编程时必须保证字节对齐,否则访问一个没有进行字节对齐的变量的时候会发生错误。而有些平台可能没有这种情况,但是通常的情况是如果我们编程的时候不按照适合其平台要求对数据存放进行 阅读全文
摘要:
//如何将一个ASCII码的数据,分解为其两位16进制字符型数据,保存在一个字符数组中#include <stdio.h>#include <string.h>#include <unistd.h>int http_encode(char c,char *out){ int j = 0; char hex_table[16] = "0123456789abcdef"; out[j] = hex_table[c >> 4]; j++; out[j] = hex_table[c & 0x0f]; j++; out[j] = 阅读全文
摘要:
一旦我们建立了连接,我们的下一步就是进行通信了.在Linux下面把我们前面建立的通道 看成是文件描述符,这样服务器端和客户端进行通信时候,只要往文件描述符里面读写东西了. 就象我们往文件读写一样. 4.1 写函数write ssize_t write(int fd,const void *buf,size_t nbytes) write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节数.失败时返回-1. 并设置errno变量. 在网络程序中,当我们向套接字文件描述符写时有俩种可能. 1)write的返回值大于0,表示写了部分或者是全部的数据. 2)返回的值小于0,此时 阅读全文
摘要:
在linux的socket编程中,经常要处理EINTR错误,其值为4,用strerror(errno)调用返回的错误描述为:Interrupted system call. 这里给出一个connect连接中对EINTR处理的网址: http://www.madore.org/~david/computers/connect-intr.html 另外转载网络上其他兄弟对EINTR错误的处理: 1. accetp()是慢系统调用,在信号产生时会中断其调用并将errno变量设置为EINTR,此时应重新调用accept()。所以使用时应这样:(网址:http://bbs.loveunix.net/vi 阅读全文
摘要:
当linux中的C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因,在实际编程中用这一招解决了不少原本看来莫名其妙的问题。但是errno是一个数字,代表的具体含义还要到errno.h中去阅读宏定义,而每次查阅是一件很繁琐的事情。有下面几种方法可以方便的得到错误信息 (1)void perror(const char *s)函数说明perror ( )用来将上一个函数发生错误的原因输出到标准错误(stderr),参数s 所指的字符串会先打印出,后面再加上错误原因 字符串。此错误原因依照全局变量 阅读全文
摘要:
Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到,Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该是Windows的优点)相比,后者无疑在易操作性上更胜一筹。但是为什么又有那么多的爱好者钟情于Linux呢,当然自由是最吸引人的一点,另外Linux强大的功能也是一个非常重要的原因,尤其是Linux强大的网络功能更是引人注目。放眼今天的WAP业务、银行网络业务和曾经红透半边天的电子商务,都越来越倚重基于Linux的解决方案。因此Linux网络编程是非常重要的,而且当我们一接触到Linux网络编程,我 阅读全文
摘要:
If you're new to Linux and looking for a great BitTorrent client, you're in luck. Linux has a fantastic variety of BitTorrent clients and we've picked out five of the best Linux BitTorrent clients you'll find today. When many people talk about BitTorrent, they probably think of downl 阅读全文