返回列表 发帖

Linux自由之花:)

什么是Linux?

一、 直击Linux:
1.什么是Linux?
Linux是一个诞生于网络、成长于网络且成熟于网络的奇特的作系统。
1991年,芬兰赫尔辛基大学的学生Linus Torvalds(上图)
萌发了开发一个自由的UNIX作系统的想法,当年,Linux就诞生了,为了不让这个羽毛未丰的作系统矢折,Linus将自已的作品Linux通过Internet发布。从此一大批知名的、不知名的电脑黑客、编程人员加入到开发过程中来,Linux逐渐成长起来。
Linux一开始是要求所有的源码必须公开,并且任何人均不得从Linux交易中获利。然而这种纯粹的自由软件的理想对于Linux的普及和发展是不利的,于是Linux开始转向GPL,成为GNU阵营中的主要一员。
现在,Linux凭借优秀的设计,不凡的性能,加上IBM、INTEL、CA、CORE、ORACLE等国际知名企业的大力支持,市场份额逐步扩大,逐渐成为主流作系统之一。
2.什么是自由软件?
自1984年起,麻省理工学院开始支持“世界最后一名黑客”Richard stallman在软件开发团体中发起自由软件运动,从而自由软件基金会FSF、GPL协议和GNU项目就此诞生,掀开了自由软件革命的序章。
GPL,通用公共许可协议,这是与传统商业软件许可协议CopyRight对立的,所以又被戏称为CopyLeft。GPL保证任何人有共享和修改自由软件的自由。任何人有权取得、修改和重新发布自由软件的源代码,并且规定在不增加附加费用的条件下可以得到自由软件的源代码。同时还规定自由软件的衍生作品必须以GPL作为它重新发布的许可协议。
而GNU项目的目标是建立可自由发布的、可移植的UNIX类作系统。
3.从技术上说,Linux有什么优点?
1) 提供了先进的网络支持:内置TCP/IP协议;
2) 真正意义上的多任务、多用户作系统;
3) 与UNIX系统在源代码级兼容,符合IEEE POSIX标准;
4) 核心能仿真FPU;
5) 支持数十种文件系统格式;
6) 完全运行于保护模式,充分利用了CPU性能;
7) 开放源代码,用户可以自己对系统进行改进;
8) 采用先进的内存管理机制,更加有效地利用物理内存;
4.我需要学习Linux吗?
电脑初学者:强烈建议你远离配置、管理均相当繁琐的Linux,去拥抱Windows那通俗易懂的图形界面;
文字处理者:Windows多年的发展,已经开发出了一套“所见即所得”文字处理软件,犯不着与黑底白字的vi较劲;
编程爱好者:Linux的源代码完全公开,是编程爱好者的福音。剖析内核,量身定做不是你的愿望吗?怎么样,试试吧!
网络管理员:拥抱Linux吧。据权威机构评测 ,Linux在同配置机器上的网络服务效率是NT的1.8倍,而且还是免费的,老板一定会笑的。
总之,如果你具备以下条件之一,就拥抱Linux吧:
1) 对编程有狂爱,总喜欢用程序解决问题;
2) 具有较强的钻研精神,喜欢对问题刨根问底;
3) 对构造网络服务器有兴趣的人;
4) 你的PC老掉牙了,跑Windows像蜗牛;
5) 想学习、了解UNIX作系统;
6) 极其厌恶Windows的蓝屏死机;
7) 不想花钱,又想用正版软件的人。
5.Linux会取代Windows 9x吗?
计算机在应用中可以分为桌面应用(工作站/客户机)和服务器应用,桌面应用直接面向客户,实现一些个性化的工作;服务器应用则是一些后台处理系统,实现一些共性的服务工作。对于桌面应用来说,易用性十分重要,而对于服务器而言,性能可靠、稳定才是更重要的。
所以为服务器设计的性能可靠、稳定的UNIX作系统与为桌面系统设计的用户界面友好的Windows 9x系统一直是长期并存的主流作系统。
Linux作系统是一种类UNIX作系统,其设计上对稳定性的考虑比易用性考虑要多得多,它不是一种桌面系统,它也不是为了取代桌面系统而出现的。所以Linux不会取代Windows 9x。
6.Linux与WindowsNT谁更好?
WindowsNT作系统是微软公司进军服务器作系统的利器,设计系统时在满足服务器需求的前提下,融入了Windows 9x的图形化界面的优势,使得其易于使用,深受用户喜欢,其市场占有率也因此节节上升。
然而图形界面的代价,使系统的效率降低了,所以它适合中小企业、个人用户、对性能要求不严格的场合选用。
而Linux则适用于强调性能指标,对用户界面要求不大的的应用上。
7.Linux与UNIX有什么不同?
Linux也是属于UNIX家族的一员,它有许多特性是与UNIX相同的,它们之间的最大区别在于以下两点:
1) UNIX系统大多是与硬件配套的,而Linux则可运行在多种硬件平台上;
2) UNIX是商业软件,而Linux是自由软件,免费、公开源代码的。
8.Linux能应用在哪些领域呢?
1) 教育领域:设计先进、公开源代码这两大特性使得Linux成为了作系统课的活教材;
2) 网络服务器领域:稳定、健壮、系统要求低、网络功能强使得Linux成为现在Internet服务器作系统的首选,现已达到了25%的占有率;
3) 企业Intranet:可以用低廉的投入架设E-MAIL服务器、WWW服务器、代理服务器、透明网关、路由器;
4) 视频制作领域:著名的《泰坦尼克号》就是由200多台Linux协作完成其中的特技效果的。
9.Linux作系统发展现状和未来如何?
在2000年的LinuxWorld大会上,明显感觉到:社会各界对免费发布的作系统的支持的力度大大增强了,特别是许多硬件厂商,比如 IBM、HP和 Dell 纷纷加入到Linux领域,极大地促进了这种作系统的发展。
虽然,现在纷繁复杂的多种Linux发行版,各自为阵,降低了Linux的整体战斗力。但业界认为,不同的发行版本最终会产生不断细分的市场,各个版本将专注处理比较专业的东西。
Linux作系统经历过市场的洗礼之后,一定会创造出更大的辉煌。
10.Linux对软件业有什么影响呢?
最早,程序是程序员思想的结晶,是人类共同的文化。后来,微软公司的创始人比尔.盖茨先生创建了一个全新的软件产业模式:程序是花钱购买的,源程序是程序员的知识产权,是需要保护的。这个软件的商业模式缔造了微软帝国,也将比尔推到了世界首富的位置。
如果说,微软的Windows为世界做了很大的贡献的话,那么同时它也会软件业的发展带来了垄断和铜臭。自由软件FSF组织就是想通过GNU项目来打破这一格局,再次让所有人共享程序员思想的结晶----源代码。
而Linux的加盟,使得自由软件组织更具有战斗力,事实证明,的确对现在的软件业造成了深远影响。同时,Linux奇特的开发方式,也为软件业的创新提供了宝贵经验。
11.我该如何学习Linux呢?
1) 多阅读Linux书籍,如《Linux大全》、《RedHat Linux奥秘》、《Linux系统管理白皮书》等;
2) 敢于尝试,经常使用Linux,从实践中学习Linux,别怕“try again”;
3) 经常通过网络与Linux爱好者们互相交流,提高自己。
12.网上有哪些Linux资源?
在Internet上,关于Linux的网站很多,其中比较优秀的中文网站有:
1) www.linuxaid.com.cn:设有Linux论坛、在线答疑、知识库、在线培训、解决方案等栏目;
2) www.linuxforum.net:这里应该是人气最旺的Linux论坛;
3) www.lslnet.com/linux:是一个更新较快的Linux专题网站;
4) www.linuxbyte.com:是一个较好的Linux网站;
5) www.clinuxdevelop.org:中国Linux开发联盟;
6) clyan.hongnet.com:linux数据库应用指南。

介绍完毕:)

Linux自由之花:)

[这个贴子最后由萧儿在 2004/01/11 05:12pm 第 1 次编辑] 这篇教程是用来介绍在Linux下编写网络程序的. Linux系统的一个主要特点是他的网络功能非常强大。随着网络的日益普及,基于网络的应用也将越来越多。 在这个网络时代,掌握了Linux的网络编程技术,将令每一个人处于不败之地,学习Linux的网络编程,可以让我们真正的体会到网络的魅力。 想成为一位真正的hacker,必须掌握网络编程技术。 现在书店里面已经有了许多关于Linux网络编程方面的书籍,网络上也有了许多关于网络编程方面的教材,大家都可以 去看一看的。在这里我会和大家一起来领会Linux网络编程的奥妙,由于我学习Linux的网络编程也开始不久,所以我下面所说的肯定会有错误的, 还请大家指点出来,在这里我先谢谢大家了。 在这一个章节里面,我会和以前的几个章节不同,在前面我都是概括的说了一下, 从现在开始我会尽可能的详细的说明每一个函数及其用法。好了让我们去领会Linux的伟大的魅力吧! 1. Linux网络知识介绍 1.1 客户端程序和服务端程序 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 网络程序是先有服务器程序启动,等待客户端的程序运行并建立连接.一般的来说是服务端的程序 在一个端口上监听,直到有一个客户端的程序发来了请求. 1.2 常用的命令 由于网络程序是有两个部分组成,所以在调试的时候比较麻烦,为此我们有必要知道一些常用的网络命令 netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项 我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可以使用帮助手册获得详细的情况. telnet telnet是一个用来远程控制的程序,但是我们完全可以用这个程序来调试我们的服务端程序的. 比如我们的服务器程序在监听8888端口,我们可以用telnet localhost 8888来查看服务端的状况. 1.3 TCP/UDP介绍 TCP(Transfer Control Protocol)传输控制协议是一种面向连接的协议,当我们的网络程序使用 这个协议的时候,网络可以保证我们的客户端和服务端的连接是可靠的,安全的. UDP(User Datagram Protocol)用户数据报协议是一种非面向连接的协议,这种协议并不能保证我们 的网络程序的连接是可靠的,所以我们现在编写的程序一般是采用TCP协议的. 2. 初等网络函数介绍(TCP) Linux系统是通过提供套接字(socket)来进行网络编程的.网络程序通过socket和其它几个函数的调用,会返回一个 通讯的文件描述符,我们可以将这个描述符看成普通的文件的描述符来操作,这就是linux的设备无关性的 好处.我们可以通过向描述符读写操作实现网络之间的数据交流. 2.1 socket int socket(int domain, int type,int protocol) domain:说明我们网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等). AF_UNIX只能够用于单一的Unix系统进程间通信,而AF_INET是针对Internet的,因而可以允许在远程 主机之间通信(当我们 man socket时发现 domain可选项是 PF_*而不是AF_*,因为glibc是posix的实现 所以用PF代替了AF,不过我们都可以使用的). type:我们网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM等) SOCK_STREAM表明我们用的是TCP协议,这样会提供按顺序的,可靠,双向,面向连接的比特流. SOCK_DGRAM 表明我们用的是UDP协议,这样只会提供定长的,不可靠,无连接的通信. protocol:由于我们指定了type,所以这个地方我们一般只要用0来代替就可以了 socket为网络通讯做基本的准备.成功时返回文件描述符,失败时返回-1,看errno可知道出错的详细情况. 2.2 bind int bind(int sockfd, struct sockaddr *my_addr, int addrlen) sockfd:是由socket调用返回的文件描述符. addrlen:是sockaddr结构的长度. my_addr:是一个指向sockaddr的指针. 在中有 sockaddr的定义 struct sockaddr{ unisgned short as_family; char sa_data[14]; }; 不过由于系统的兼容性,我们一般不用这个头文件,而使用另外一个结构(struct sockaddr_in) 来代替.在中有sockaddr_in的定义 struct sockaddr_in{ unsigned short sin_family; unsigned short int sin_port; struct in_addr sin_addr; unsigned char sin_zero[8]; 我们主要使用Internet所以sin_family一般为AF_INET,sin_addr设置为INADDR_ANY表示可以 和任何的主机通信,sin_port是我们要监听的端口号.sin_zero[8]是用来填充的. bind将本地的端口同socket返回的文件描述符捆绑在一起.成功是返回0,失败的情况和socket一样 2.3 listen int listen(int sockfd,int backlog) sockfd:是bind后的文件描述符. backlog:设置请求排队的最大长度.当有多个客户端程序和服务端相连时, 使用这个表示可以介绍的排队长度. listen函数将bind的文件描述符变为监听套接字.返回的情况和bind一样. 2.4 accept int accept(int sockfd, struct sockaddr *addr,int *addrlen) sockfd:是listen后的文件描述符. addr,addrlen是用来给客户端的程序填写的,服务器端只要传递指针就可以了. bind,listen和accept是服务器端用的函数,accept调用时,服务器端的程序会一直阻塞到有一个 客户程序发出了连接. accept成功时返回最后的服务器端的文件描述符,这个时候服务器端可以向该描述符写信息了. 失败时返回-1 2.5 connect int connect(int sockfd, struct sockaddr * serv_addr,int addrlen) sockfd:socket返回的文件描述符. serv_addr:储存了服务器端的连接信息.其中sin_add是服务端的地址 addrlen:serv_addr的长度 connect函数是客户端用来同服务端连接的.成功时返回0,sockfd是同服务端通讯的文件描述符 失败时返回-1. 2.6 实例 服务器端程序 /******* 服务器程序 (server.c) ************/ #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int sockfd,new_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size,portnumber; char hello[]=\"Hello! Are You Fine?\\n\"; if(argc!=2) { fprintf(stderr,\"Usage:%s portnumber\\a\\n\",argv[0]); exit(1); } if((portnumber=atoi(argv[1]))<0) { fprintf(stderr,\"Usage:%s portnumber\\a\\n\",argv[0]); exit(1); } /* 服务器端开始建立socket描述符 */ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { fprintf(stderr,\"Socket error:%s\\n\\a\",strerror(errno)); exit(1); } /* 服务器端填充 sockaddr结构 */ bzero(&server_addr,sizeof(struct sockaddr_in)); server_addr.sin_family=AF_INET; server_addr.sin_addr.s_addr=htonl(INADDR_ANY); server_addr.sin_port=htons(portnumber); /* 捆绑sockfd描述符 */ if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { fprintf(stderr,\"Bind error:%s\\n\\a\",strerror(errno)); exit(1); } /* 监听sockfd描述符 */ if(listen(sockfd,5)==-1) { fprintf(stderr,\"Listen error:%s\\n\\a\",strerror(errno)); exit(1); } while(1) { /* 服务器阻塞,直到客户程序建立连接 */ sin_size=sizeof(struct sockaddr_in); if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1) { fprintf(stderr,\"Accept error:%s\\n\\a\",strerror(errno)); exit(1); } fprintf(stderr,\"Server get connection from %s\\n\", inet_ntoa(client_addr.sin_addr)); if(write(new_fd,hello,strlen(hello))==-1) { fprintf(stderr,\"Write Error:%s\\n\",strerror(errno)); exit(1); } /* 这个通讯已经结束 */ close(new_fd); /* 循环下一个 */ } close(sockfd); exit(0); } 客户端程序 /******* 客户端程序 client.c ************/ #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int sockfd; char buffer[1024]; struct sockaddr_in server_addr; struct hostent *host; int portnumber,nbytes; if(argc!=3) { fprintf(stderr,\"Usage:%s hostname portnumber\\a\\n\",argv[0]); exit(1); } if((host=gethostbyname(argv[1]))==NULL) { fprintf(stderr,\"Gethostname error\\n\"); exit(1); } if((portnumber=atoi(argv[2]))<0) { fprintf(stderr,\"Usage:%s hostname portnumber\\a\\n\",argv[0]); exit(1); } /* 客户程序开始建立 sockfd描述符 */ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { fprintf(stderr,\"Socket Error:%s\\a\\n\",strerror(errno)); exit(1); } /* 客户程序填充服务端的资料 */ bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(portnumber); server_addr.sin_addr=*((struct in_addr *)host->h_addr); /* 客户程序发起连接请求 */ if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { fprintf(stderr,\"Connect Error:%s\\a\\n\",strerror(errno)); exit(1); } /* 连接成功了 */ if((nbytes=read(sockfd,buffer,1024))==-1) { fprintf(stderr,\"Read Error:%s\\n\",strerror(errno)); exit(1); } buffer[nbytes]=\\; printf(\"I have received:%s\\n\",buffer); /* 结束通讯 */ close(sockfd); exit(0); } MakeFile 这里我们使用GNU 的make实用程序来编译. 关于make的详细说明见 Make 使用介绍 ######### Makefile ########### all:server client server:server.c gcc $^ -o $@ client:client.c gcc $^ -o $@ 运行make后会产生两个程序server(服务器端)和client(客户端) 先运行./server portnumber& (portnumber随便取一个大于1204且不在/etc/services中出现的号码 就用8888好了),然后运行 ./client localhost 8888 看看有什么结果. (你也可以用telnet和netstat试一试.) 上面是一个最简单的网络程序,不过是不是也有点烦.上面有许多函数我们还没有解释. 我会在下一章进行的详细的说明. 2.7 总结 总的来说网络程序是由两个部分组成的--客户端和服务器端.它们的建立步骤一般是: 服务器端 socket-->bind-->listen-->accept 客户端 socket-->connect 如果您认为我收录的文章侵犯了您的版权,请告诉我 有任何问题请到留言本 提出 萧儿整理

TOP

Linux自由之花:)

是的
]就是C

TOP

返回列表 回复 发帖