当前位置:首页 » 操作系统 » osp源码

osp源码

发布时间: 2022-06-01 14:05:36

⑴ c代码编程问题,怎样初始化已定义的结构体

第一章:前言
对于c语言,有人认为它已经落伍了.对于这个问题,仁者见仕,智者见智.的确,c++比c有更强大的诸多优势.但c++是建立在c之上的.这也是herbert schildt所着的<>在全世界畅销不衰的原因.更何况,要深入学习linux就必需要有相当的c功底.(这也是我搜集整理本文的根由:-)
现结合个人在编程中的体会,为使新手少走弯路,为老手锦上添花,因此无论你是使用c或c++编程,也无论你是程序设计的初学者还是成熟的专业人员,均会发现,本文将会对你有所收益.当然,我尽力写得清晰易懂,又不古板.
我爱c.(正如世人爱上帝一样:-)..

你可以在forum.linuxaid.com.cn上获得此帖的文本.而其html版本正在赶制之中......

第二章:约定
专业的源程书写风格.
先看看世界级c大师的源程书写风格.如 steve maguire 就有许多不错的建议.

[]倡导使用易于理解的"匈牙利式"的命名约定.
所有的字符变量均以ch开始; 如: char ch_****;
所有的字节变量均冠以b; 如: byte b_****;
所有的长字变量均冠以l; 如: long l_****;
所有的指针变量均冠以p; 如: char *p_ch_****;
建议类型派生出的基本名字之后加上一个以大写字母开头的"标签".如:
分析 char **ppchmydata;
其让人一眼就能看出它****一个指向字符指针mydata的指针.
"匈牙利式"命名的最大不足是难念:-(( .但相对于不是总统演讲稿的c源程来说,这又算得了什么?想想看以下的数据命名:
char a,b,c;
long d,e,f;
[]倡导规范书写.
如果你思如泉涌,而不去也不及顾虑书写格式,那也没关系.在将其交出去之前,用cb命令格式化你的源程.虽然源程的格式不会影响到你编译结果的正确性,但切记,能让其他的程序员能轻松地阅读它.否则没人会理你的.
关于cb命令的更多用法,可以用man cb来参考其手册页.
当然除了cb之外,还有更多更好的.但cb是你在任何unix(linux)上都找得到的.更何况它并不差
第三章:开始任务
开始任务之前,先做个深呼吸!
[]其他文档你准备好了吗?
你是不是除了c源程之外一无所有了吗?兵马未动,粮草先行.你必须先清楚该程序所要完成的功能.在开始写程序之前,对程序的功能应有规范说明.书写规范书和确知程序功能的一个方法是先编写相应的操作手册.如果你是一人单干,劝你首先写需求书.切记切记,这对你意味着事半功倍的大好事.
一个实例:我计划为本行的信贷子功能模块打一个补丁.我用10周的时间用来写规划书,需求书,操作流程,使用说明等等文档.之后用2周的时间编写程序,在初步测试(1周)后递交给各信贷部门测试使用.然后根据反馈的信息再更改相应文档,并根据文档修改源程.6个月后发布正式版.
[]一定该遵循ansi标准吗?
如果你仅使用ansi的标准首标文件,恭喜你,你的程序有着全世界范围内的广泛支持和兼容.光明无限.但你必须在通用与专用之间做出取舍,对不起,我帮不了你.
我的原则是:核心用ansi,界面按需而取.这样在转换平台时仅需另编用户界面而已.实用至上嘛.
附:ansi 标准c头文件

是不是很寒酸?
[]再续前缘?
在得到新任务之后并在开始该新任务之前应马上回想有哪些是曾经拥有的.旧调重弹远比另起炉灶来的高效与环保.
[]是否该有自已的库?
我的答案是应该有自已的特色库,并与ansi兼容.与3.8不同的是,你仅需在源程序之后附上自已的专用库就可以了.其次在有了自已的库后,源码会很精炼的.不用去羡慕别人了吧.
[]要学会条件编译.注意你的平台特性.(高手的标志?)
除非你确定你要写的程序是在某特定的os特定的硬件平台而量身定做.否则应注意数据类型的长度,精度都是不同的,不要想当然.有时甚至是不同的编译器的差异都要考虑考虑.
....
....(欢迎您来充实此处空白)
....
好了,在任务中,又有哪些细节呢?
[]我是不是葛郎台?
不要那么吝啬.在源程序中加入详尽的注释以使自己和他人即使在许多年以后仍能读明白它是什么样的程序.
用注释行分离各个函数.
[]删除不需要的代码时要小心.
一个好建议是:使用#ifdef del,而不是简单地注释掉甚至是粗暴地直接dd.如果你是使用/* ... */,但一旦要删除的代码有很多行,或注释中以有注释时,这就可能不那么好使了.
[]如何给源程序文件命名?
表现特色且不与任何原有应用名相同.一个简单地方法就是试试看,系统有什么样地反应?
[]一次只修改一个地方.
[]一次只编写一个单一功能的函数。
[]编写通用程序.
只有当程序编写完,并且完成了所需要的性能要求之后,再反过头来优化该程序.
[]不要使用a.out作为结果.你大可以使用与源程相同的可执行文件名.
[]是否一定要用vi编辑?
linux下有许多专用编程编辑器.它们能使你有更高的效率和更低的低级输入错误,但我还是要劝你至少要熟练掌握vi.毕竟vi遍地开花.
[]协同作业.请相信,你不是在孤军作战.因此,你有必要熟练掌握一些其它的工具

第四章:使用lint
lint没有你想象中的那样糟糕.相反,一旦源程序形成了没有lint错误的形式,将很容易保持下去,并享受到如此而带来的好处.
[]在cc(gcc)之前就应使用lint.
lint是一语法检查程序,对于这个多嘴的婆婆来说,你应有足够的耐心.虽然你知道自已在干什么,但在cc之前使用lint总是一个好习惯.
[]lint有哪些特色?
在编译之前使用lint的重要原因是lint不但能发现ansi c中的语法错误,而且也能指出潜在的问题或是难于移植于另一机器的代码问题.除了能指出简单语法错误之外,linut还能基于以下原因指出另外的错误:
a.无法达到的语句.
b.没有进入循环.
c.没有被使用的变量.
d.函数参数从未使用.
e.没有赋值之前自动使用参数.
f.函数在有些地方有返回值,但在其他地方不返回.
g.函数调用在不同地方使得参数个数不同.
h.错误使用结构指针.
i.模糊使用操作符优先级.
呵呵呵,挺有用的吧!
[]如何控制lint的输出?
有时lint会有一大屏一大屏的警告信息.但似乎并未指出错误.为了找出潜在的错误则需费心费力地浏览这些大量的警告信息.
但如果你的程序会分出几个独立的模块,在初级启动lint时不要用可选项.当对这些模块进行更改或扩充时,可以忽略与代码无关的某些警告.为此可用以下选择项:
-h 对判别是否有错,类型是否正确不给出启发式测试.
-v 不管函数中没有定义的参数
-u 不管被使用的变量和函数没有定义或定义了但没有使用.
[]干脆,在程序中插入指令来影响lint运行.它看样子有些像注释.
/*notreached*/ 不可达到的代码不给信息说明.
/*varargsn*/ 函数的变量个数不作通常的检查,只检查开始n个参数的数据类型.
/*nostruct*/ 对下一个表达式不作严格类型检查.
/*argused*/ 下一函数中,不给出没被使用参数的警告信息.
/*lintlibrary*/ 置于文件的开头,它将不给出没被使用函数的警告信息.
关于lint的更多用法,请用man lint来获知

第五章:使用make
[]什么是make?
unix(linux)是一个天生的开发平台,我为此感到高兴.make是一个强力的工具.它能依赖的源代码块并组成一程序,使得很容易建立一可执行程序.make就是这种有依赖关系的部分和代码之间所作的规格说明.
[] 所有的程序都要使用make?
是的.尽管你只有几个简单的模块,但你需要有一种结构来支持它从简单走向复杂.除非你的程序已经盖棺定论.
[]makefile由哪些组成?
makefile由以下几个部分组成:
注释.
^^^^
使用#符号插入.make将忽略#之后的任何内容以及其后的return键.
变量.
^^^^
make允许定义与shell变量类似的有名变量.比如,你定义了sources=prog.c,那么该变量的值$(scoures)就包含了源文件名.
依赖关系.
^^^^^^^^
左边是目标模块,后接一冒号.再接与该模块有依赖关系的模块.
命令.
^^^^
以tab键开始(即使用相同数量的空格也不能代替它).
[]makefile示例
下面介绍一个简单的示例来说明make的用法.假设你的程序有两个源文件main.c和myc.c,一个位于子目录include下的头文件myhead.h,一个库由****源文件myrout1.c,myrout2.c,myrout3.c产生.
其makefile文件为:
#一个基本的makefile文件.
#其中包括个人的头文件和个人库.
headers=include/myhead.h
sources=main.c myc.c
proct=$(home)/bin/tool
lib=myrout.a
libsoures=myrout1.c myrout2.c myrout3.c
cc=cc
cflags=-g
all:$(proct)
$(proct):$(sources)
$(cc)$(cflags) -o $(proct)$(sources)
lint:$(proct)
lint $(sources)$(libsources)
哈哈,挺象shell编程的.如果你与我一样使用linux下的gcc,那么只要把上面的cc=cc改为cc=gcc即可.怎么样,想来一个更复杂点的吗?
[]一个更为复杂的makefile
你是否注意到,在上例中,只要启动make,就会重新编译所有源代码.
如果你能看懂以下的makefile,恭喜恭喜,你通关了.
#一个更为复杂的makefile
headers=include/myhead.h
soures=main.c myc.c
objects=main.c myc.c
proct=$(home)/bin/tool
lib=myrout.a
libsources=myrout1.c myrout2.c myrout3.c
libobjects=$(lib)(myrout1.o)$(lib)(myrout2.o)$(lib)(myrout3.o)
include=include
cc=cc
cflags=-g -xc
lint=lint
lintflags=-xc
all:$(proct)
$(proct):$(objects)$(lib)
$(cc)(cflags)-o$(proct)$(objects)$(lib)
.c.o: $(headers)
$(cc)$(cflags) -c i$(include)$<
$(lib):$(headers)$(libsources)
$(cc) $(cflags) -c $(?:.o=.c)
ar rv $(lib) $?
rm $?
.c.c:;
lint: $(proct)
$(lint)$(liniflags)$(sources)$libsources)

第六章:优质无错编程
亲爱的,检查一下,你是否注意到了以下的细节?也就是说,你是否是一个合格的,能编写优质无错代码的程序员?要永远记住,编写无错代码是程序员的责任,而不是测试员.(摘录于本人的"细节页",因此本节将永远不会保持完整,欢迎您来充实她)
[]所有程序员至少出现过的一个错误:
if(a=3){......}如果a等于3,那么......
你至少要养成这样的习惯:当判断一个变量与一个常量是否相等时,将常量写在前面.这样即使你一不小心写成这样:if(3=a){......}在cc 之前就可以很容易发现它.
[]老调重弹:逻辑操作符的优先权.
我不愿多嘴.总之,如果你一定要编写如下代码时:
if(a&0x1&&b&0x2){......}
你的手头最好有一本详尽的指南.或者你是这方面的专家.
[]尽量不使用int数据类型.
这仅是一个忠告.你大可使用char,short,long数据类型.若干年以后,当你成长为高手之时,你会发现此时我的良苦用心.
[]对于非整型函数一定要完整定义.
如 long float jisuan(char charr[],int chnum)
{ long float lmydata;
...
...
return(lmydata); }
[]对于非整型函数的输入要当心.
如 long float lfnum;
...
...
scanf("%lf",&lfnum);
[]float 型的有效数字为7位.当多于7位时,第8位及以后的位将不准确,可以将其定义为long float型.
[]文件的输入出尽量采用fread fwrite函数.只有当另有用途时才用fprintf fscanf 函数

⑵ eMule有什么优点

eMule是一个开放的P2P档案分享软件,基于eDonkey的网络协议。eMule这个名称来源于一个动物——骡,所以中文中也称作电骡或骡子等。

eMule起源

在2002年05月13日一个叫做Merkur的人,他不满意当时的eDonkey 2000客户端并且坚信自己能做出更出色的P2P软件,于是便着手开发。他凝聚了一批原本在其他领域有出色发挥的程序员在他的周围,eMule工程就此诞生。他的目标是将eDonkey的优点及精华保留下来,并加入新的功能以及使图形界面变得更好。现在eMule的最新版本是0.47a。

现在eMule已是世界上最大并且最可靠的点对点文档共享的客户端软件。感谢开放源代码的政策,使许多开发人员能够对这个工程有所贡献,从而使发布新版本显得更有效率。

eMule特色

客户端使用多个途径搜索下载的资源,ED2K、来源交换、Kad共同组成一个可靠的网络结构。

eMule的排队机制和上传积分系统有助于激励人们共享并上传给他人资源,以使自己更容易、更快速地下载自己想要的资源。

eMule是完全免费的。也完全没有任何的广告软件。他们这么做是为了乐趣及知识,而不是为了金钱。

每个下载的文件都会自动检查是否损坏以确保文件的正确性。(FTP却不能保证精确复制)

智能损坏控制有助于快速修复损坏的部分。

自动优先权及来源管理系统允许您一次下载许多个资源而无须监视它们。

预览功能允许您在下载完成之前查看您的视频文件。

eMule的Web服务特性和Web服务器允许您快速得从网络存取资料。

能在下载时间里类别以组织和管理文件。

寻找您想要的资源,eMule提供了一个大范围的搜索方式,包含了:服务器搜索(本地和全球)、基于Web搜索(Jigle和Filedonkey)及Kad网络(仍在测试)。

eMule还允许您使用非常复杂的布林搜索使搜索更为灵活。

使用信息及好友系统,您能传送讯息到其他的客户端并可将他们加为您的好友。有好友上线的话,你就能在您的好友列表中看到他(她)。

使用内建的IRC客户端, 您能和全世界其他的共享者聊天。

在官方版基础上,有各种各样的修改版本(Mod),提供了各种不同的附加功能。并且这些Mod也都是开放源代码的,这使得eMule的发展突飞猛进。

eMule与其他P2P软件相比的优点及特色

客户端使用多个途径搜索下载的资料源,ED2K、来源交换、Kad共同组成一个可靠的网络结构。

在eMule v0.42及后续版本中,可以使用Kad。

eMule的排队机制和上传积分系统有助于激励人们共享并上传给他人资源,以使自己更容易、更快速地下载自己想要的资源。

eMule是完全免费的。官方版eMule也完全没有任何的广告软件。

每个下载的文件都会自动检查是否损坏以确保文件的正确性。(FTP却不能保证精确复制)

智慧损坏控制有助于快速修复损坏的部分。

自动优先权及来源管理系统允许一次下载许多个资源而无须监视它们。

预览功能可在下载完成之前查看影片。

eMule的Web服务特性和Web服务器允许使用者快速得从网络存取资料。

能在下载时间里类别以组织和管理文件。

寻找想要的资源,eMule提供了一个大范围的搜索方式,包含了:服务器搜索(本地和全球)、基于Web搜索(Jigle 和 Filedonkey)及Kad网络(仍在测试)。

允许使用非常复杂的布林搜索使搜索更为灵活。

使用信息及好友系统,能传送讯息到其他的客户端并可将他们加为好友。有好友上线的话,就能在好友列表中看到他(她)。

使用内建的IRC客户端, 使用者能和全世界的共享者聊天。

1)P2P到底是什么?

Peer-to-peer的缩写,指的是点对点的意思,最早是在美国由 18岁的Shawn Fanning开发出一个叫Napster的软件时,引入得概念 ,它不仅仅是一种软件架构,也是一种社会模式的体现,网络上流行的P2P软件的架构手段主要有两种:集中式和分布式。

集中式:便是利用服务器作为媒介使各个分散的节点(用户)能互相联系,生成各种服务响应。

分布式:每个节点即做服务器又做客户端,这种方式非常灵活,一个孤立的节点只要连上另一个节点便可以进行传输。

Napster可以说是第一代p2p软件。后来由于Napster陷入诉讼危机(相关版权问题),便出现了Gnutella,它吸取了Napster的失败教训,将P2P的理念更推进一步:它不存在中枢目录服务器,用户只要安装了该软件,立即变成一台能够提供完整目录和文件服务的服务器,并会自动搜寻其它同类服务器,从而联成一台由无数PC组成的网络超级服务器。传统网络的Server和Client在它的面前被重新定义。Gnutella作为第二代p2p软件,他们可以说是最早的p2p技术。然后FastTrack (即Kazaa 的底层技术)迅速掘起取代其地位。成为p2p老大。

2)emule到底是什么?

随着二代技术的普及,又一个的问题诞生了,自私的人们在利用P2P软件的时候大多只愿"获取”,而不愿"共享”,P2P的发展遇到了意识的发展瓶颈。不过,一头"骡”很快改变了游戏规则,它就是后来鼎鼎大名的 eDonkey。这标志着第三代p2p技术的兴起,eDonkey采用了以"分散式杂凑表”(distributed hash tables )为诉求的Neonet技术,改变了P2P网络上的搜索方式,理论上可以更有效率的搜索更多的电脑,以及更容易找出少见的文件。这种技术已经使eDonkey基本快要追上了P2P服务龙头业界的另一个老大Kazaa了. eDonkey由Jed McCaleb在2000年创立。他最重要的是可以同时从许多人那里下载同一个文件,并且采用了"多源文件传输协议”(MFTP,the Multisource FileTransfer Protocol)。电骡的索引服务器并不集中在一起的,而是各人私有的,遍布全世界,每一个人都可以运行电骡服务器,同时共享的文件索引为被称为"ed2k-quicklink”的连接,文件前缀"ED2K://”。同时,在协议中,定义了一系列传输、压缩和打包的标准,甚至还定义了一套积分的标准,你上传的数据量越大,积分越高,下载的速度也越快。而且每个文件都有有md5-hash的超级链接标示,这使得该文件独一无二,并且在整个网络上都可以追踪得到。EDonkey可以通过检索分段从多个用户那里下载文件,最终将下载的文件片断拼成整个文件。而且,只要你得到了一个文件片断,系统就会把这个片断共享给大家,尽管通过选项的设置你可以对上传速度做一些控制,但你无法关闭它。

在eDonkey出现后,其改良品种eMule(电骡)也出现了。可以说emule是eDonkey的升级版,是eDonkey的一个Mod,就象osp就是quake3的mod一样,它的独到之处在于开源,它的基本原理和运作方式,也都是基于eDonkey, eMule基于eDonkey网络协议,因此能够直接登录eDonkey的各类服务器。eMule同时也提供了很多eDonkey所没有的功能,比如可以自动搜索网络中的服务器、保留搜索结果、与连接用户交换服务器地址和文件、优先下载便于预览的文件头尾部分等等,这些都使得eMule使用起来更加便利,也让它得到了电骡的美誉。

总之,他们继承了第二代P2P无中心、纯分布式系统的特点,但他们它不再是简单的点到点通信,而是更高效、更复杂的网络通信;再加上eDonkey和eMule引入的强制共享机制,在一定程度上避免了前几代P2P纯个人服务器管理带来的随意性和低效率。

3)emule的下载原理?

当你在搜索列表中选取了你要的文件并开始下载后,emule会记录下这个文件的大小,文件名以及另一个叫做hash的特殊值。会向所有添加的服务器发出请求,要求得到有相同hash值的文件。而服务器则返回持有这个文件的用户信息。这样我们的客户端就可以直接的和拥有那个文件的用户沟通,看看是不是可以从他那里下载所需的文件。它最棒的部分就在于:你不是只在一个用户那里下载文件,而是同时从许多个用户那里下载文件。如果另一个用户仅仅只有你要的文件的一个小小片断,他也会自动地把这个片断分享个大家,而你就可以从这个用户的机器上下载这个片断。当然你也是一样。只要你得到了一个文件片断,系统就会把这个片断共享给大家。在查找到下载源(其他客户端)后,下载就是客户端和客户端通过点对点(P2P)进行直接对话了。期间没有数据流通过服务器。

4)emule是如何工作的?

emule建立于多点文件传输协议之上。一个emule网络由服务器端和客户端两部分组成。服务器端是客户端连接的、为了搜索和查找可以下载用户的桥梁。服务器列表像电话本一样排列,客户通过浏览它而获取他需要的文件所有者的客户端信息。在download过程中,没有下载文件通过服务器端。

5)emule是如何搜索的?

每一个客户端连接到一个服务器作为他的主服务器。在连接时,由客户端告诉主服务器他share了那些文件,以及IP地址等其他信息。所以每一个服务器会记录所有登陆到他服务器上的以上信息。在本服务器搜索时,它会通过匹配记录的已知以上信息把查找结果反馈给搜索的客户端列表。当你使用扩展搜索(extend search)时,你的搜索请求和应答结果通过发送限制带宽的UDP包连接到客户端本身的服务器列表(server.met)对应的某一个ip地址的服务器。

6)emule是如何下载的?

当客户端选择了一个文件下载时,它首先收集一个拥有该文档的客户端的列表。它会先行查询主服务器所有登陆用户他们是否拥有该文件。然后再连接和查选其他服务器的登陆用户所拥有该文件的客户端列表。一旦它找到拥有该文件的其他客户端,它将请求每个客户端发送这个文件的不同片。直至最后文件由这个不同的片组装成一个完整的文件。 在进行pause/resume的时候,我们选择的下载列表已经获取,它pause的仅仅是客户端和客户端之间的TCP连接然后恢复TCP连接。这个过程只有再resume时通过客户端向服务器端发送22个字节后即可。占用的仅仅是22个字节的网络流量。在pause是甚至不通过你登陆的服务器进行,也无须你登陆的主服务器进行任何干预和操作。所以说,它并未占用主服务什么资源,只是在你已经和主服务器连接的通道上发送22个字节而已。

7)emule有什么优点?

不需要服务器来存放共享文件,节省了服务器架设、海量硬盘、网络带宽。 每个用户端节点都同时是文件下载者和提供者。实际上,在你正在下载但还没当完整个文件时,你已经可以把你已下载的部分共享给别人了! 因为emule同时从很多文件提供者那里下载所需的文件最后再拼成整个文件的。加入的人越多,下载速度越快,资源越丰富。 共享方便,每个人在自已的emule里指定一个share目录就可以把自己的文件共享给网络中的其它人了。不必再辛苦地上传到服务器上了。

以上就是关于emule的一些基础知识,希望大家看完之后,能对emule的原理,有一个本质的认识。

下面我再来说说一些很困扰,很迷惑人的问题。

1)id问题

朋友们最关心的就是这个问题,id是什么?id其实没有什么用,id就是在emule传输里面,作为地址作用的一个东西,起到寻址和寻址作用,它直接和我们ip挂钩,是由emule根据我们的ip地址,通过算法得到的一组数字。所以adsl用户经常会说,为什么我的id变了?当然要变,因为你每次上网拨号所取得的ip地址都不相同,所以id当然也要随之变化,一句话;ip不变id就不变,ip变了id就变化。

关于高id和低id,目前好多朋友也存在一个误区,认为同一个ip地址,只能而且最多只能拥有一个高id,其实这是不对的。一个公网ip地址,可以同时取得2个以上的高id,这一点我要在这里强调一下,比如,adsl用户,如果你本身是高id,那么你可以同时打开第二个emule两个同时运行,但是彼此的emule端口一定不要相同,这样你会发现两个都是高id,同一个ip地址。同样对于端口映射,同一个ip地址,也可以同时取得两个以上高id,同样端口不要相同。

对于低id用户,还存在一个误区,那就是认为只要映射了,就能变成高id,这一点我要说明一下,什么叫高id,它是一个9位以上的id数字,它代表了你的ip地址是公网独立的ip,也就是说只有前提你能够拥有公网独立的ip地址,你才能获得高id,端口映射的原理是把你的内网地址和端口,通过地址转换投影到公网干线上,使你作为一个公网节点,从而变成高id。那么这里就存在一个网络拓扑的问题,有些低id用户,不是处在公网干线的一级子网内,而是子网的下一级子网,甚至下好几级子网,拓扑的结构是层层拓扑,那么这部分用户,无论如何也无法获得高id,因为你做了映射只不过是成了上一级子网的节点,但是仍然还是内网,只不过映射了一层,你上面还有好几层,所以要正确看待映射的问题。目前,国内除了电信和网通,有好多二级运营商玩的就是这个路子,他们或者层层拓扑,或者只保留部分公网ip地址,作为机动分配,这样你运气好一拨号能得到一个公网ip,你运气不好就是内网,没有办法。

3)kad问题

好多朋友对这个东西始终不太明白,我说一下,kad和我们目前的ed2k不一样,我们目前的ed2k要通过服务器进行中转,我们都要连到服务上才能进行传输,而kad则是无服务器工作模式,它的传输可以独立进行,完全不需要服务器参与,我们只需要打开kad就可以不再需要服务器了,所以说kad是属于试验阶段,应该说他的前景最为光明,应该是p2p的未来,所以建议朋友们多多打开,对于找源很有帮助,特别是对于低id而言,vkad就是vnn+kad的模式。

4)服务器问题

这个问题论坛已经说了很多了,我主要说一些大家容易误会的地方,好多朋友经常问到,怎么我的服务器少了,或者是消失了,或者开机提示列表文件丢失,这里大家要注意在emule>选项>服务器设置里面 启用智能lowid检测这一项最好不要选 启动自动更新服务器列表也不要选 把连接到其它服务器时自动更新选上,这样你可以在服务器切换的时候,自动更新服务器列表 而不用添加什么列表的url网址之类的东西,另外对于常用的服务器,最好把他的状态选择为静态服务器,这样他就不会消失了,其实我们服务器列表有300多个服务器,能够用上的就那么几个,大家可以把他们设置成高级,静态,另外还要说一点,选择服务器的时候选择ping值小的 人数多的 文件多的 这个文件数什么意思,是连接到这个服务器的所有用户的共享文件总数,要注意服务器上没有任何文件,另外大家注意一下服务器列表里面,每个服务器还有:软性文件限制 硬性文件限制, 这个是什么意思?他代表了服务器接受你的共享文件 任务列表文件的大小限制,如果你要是超过了这个限制,就会被服务器拒绝,举个例子,如果这个值显示的是1k,那么你的共享文件数最好少于1000个,目前来看大部分都是1k。

其实对于服务器端,有好多愿意研究的朋友,很感兴趣。其实他就是edonkey的服务器,二者目前列表都一样,所以大家想要自己架设em服务器,可以上edonkey网站,下载服务器端的程序,我看了一下这个程序不大,而且也很简单,有兴趣的朋友们可以自己分析一下。

5)web服务器问题

大家都看了在emule>服务器>我的信息 最下面总是有一个web服务器的东西,这个是什么?我说一下 通常情况下我们这个禁用是正常的,Web服务器的作用是提供了远程访问eMule的功能,我们可以先在emule端配置一些相关参数,然后可以实现远程利用ie来对emule进行控制,当然了需要我们emule端要有独立的访问地址,远程控制emule可以实现emule的大部分功能,但是不是全部功能,还是有一些限制。另外对于emule端的web设置,懂行的朋友还可以自己进行编程,很有交互性,一般来讲,我们什么时候能够用上它呢?比如我们在公司开了emule,但是还想下班后继续在家里操作公司的emule,那么我们就可以使用这个功能,如此还有许多场合和环境特别利于web功能的使用,但是要注意随之带来的有关网络安全性问题也很重要。对于这个功能的使用,要是详细写出来的话,要很长需要专门的一个主题说明,由于篇幅限制,我在这里先简单说一下,如果朋友们都比较感兴趣,我考虑单独写一个主题详细说明具体设置和用法。不再赘述。

6)emule日志问题

其实这个问题没什么好说的,日志就是记载了emule的运行记录,我要强调的是好多朋友不懂得利用它,其实大部分emule遇到问题的时候,我们如果仔细注意日志记录,都会自己找到问题原因所在,如果你不懂你可以把它复制下来,发到网上,希望各位朋友以后多多注意emule的日志记录,遇到问题,多半能都自己解决。

7)任务下载问题

对于这个问题,我想说得是大家要学会使用给任务分优先级来控制下载顺序,经常有许多朋友抱怨,为什么任务结束一个,开始下一个的时候是随机开始,怎么能实现自动控制?这里我们就可以手动设置任务列表里面任务的优先级,右键就可以看到,把不同任务的优先级设置成高 中 低 这样emule在完成一个的时候自然按照优先级去选择下一个该是谁,而不会随机开始了,另外在选项里面也可以设置一下,新建任务为停止模式,或者自动开始下一个停止文件。

8)搜索问题

其实要是大家都学会了利用该功能,就会找到好多意想不到的东西,好多朋友平时很少用这个功能,其实p2p引以为自豪的就是他的搜索功能,建议大家以后多多自己搜索,搜索的时候要注意,每页都有200条的限制,所以要想看更多的可以点击旁边的"更多”,这样可以显示下一个200条,可不要以为就只有第一页的200条记录啊!对于搜索颜色问题我说明一下:

红色:代表你的任务列表里面已经有的文件 或者 你已经下载完成正在共享的文件

蓝色:普及程度较高源比较多的文件

黑色:你从来都没有下载过的文件

9)共享文件问题

这个我说明一个问题,emule 里面规定共享的单个文件,注意是"单个”文件不可以超过4g,如果超过了,则不可以进行hash,所以大家注意一下。

10)emule消息问题

经常有朋友会受到You Was Banned!!! Banreason: You use a Leecher Mod

或者Defcon Old Leecherdetection之类的消息,这是什么意思?

有些朋友以为是有人要聊天,发送过来的消息,其实误会了,这是自动发送的信息,它的意思是你用的版本是吸血的版本。你已经被ban。对于这个消息,大家可以不用理会,用emule消息过滤,把它过滤掉就可以了,为什么会如此呢?这个要是说起来也话长了,颇有点传奇色彩。我简单说说,部分mod版本呢,由于加分设置不同,逐渐分成不同的派别,这样逐渐形成了一些小圈子,后来搞出来一个所谓吸血的东西,只下载不上传,或是该版本群体上传远远小于下载,等等这里面有好多渊源,后来官方公开封禁了一些,再后来自然被封的不服,然后就是妖魔和反妖魔大家互相封禁,互相职责,后来斗争扩大化,导致其他版本也跟着遭殃,我们就是属于被误伤的,现在这种争斗仍然在继续,而且波及越来越广,这就是我对这个消息的原因的简单解释,好多内幕的东西,说起来挺多,不多说了。

11)代理问题

这里我要说明一点,好多朋友使用代理运行emule,比如一些公司内网的朋友,你们在寻找代理的时候,尽量使用sock5的代理,当然sock4和http也可以,但是要注意好多http代理本身不支持udp协议,所以导致了emule无法运行,大家要注意,选择支持udp协议的代理。而且多找几个,留作备用。

12)统计信息问题

这个问题,我要说两点

(1)上传:下载比例问题 之前好多朋友对这个有很多误会,这里我要说明这个比例大于1说明你的贡献大于索取,等于1,说明你的贡献和索取一致。小于1,则说明了你是一个索取的人,对p2p的贡献为负。大家一定要注意谁比谁,哪个是分母,哪个是分子,那么这有什么用呢?要注意p2p是一个讲究奉献,讲究积分的东西,你的上传多,你的下载快,这个比例也说明了使用者素质问题,另外对于这个比例,我们也有一些奖惩措施,比如 上传:下载大于2,也就是说明了你的上传量是下载量的2倍,这个时候你在排队的时候,就可以享受优先排队待遇,这个比值越大越好,不存在什么限制,越大说明你的上传量越多,说明你的积分越多,你的贡献越多,当然你排队的时间就越少。如果这个比值小于1,而且越来越小,那么同样你的速度也会越来越慢,这个你怨不了谁。

(2)速度大小的问题 好多朋友往往只关注了那个最大速度,但是实际上那个数值没有什么意义,他只是一个曲线峰值,往往一闪即逝,或者最多持续几秒,我们要关注的是我们的平均速度,这个二元值包含了时间的因素,所以他才能说明我们emule的整体速度大小。

13)积分问题

积分不是你对所有人的积分,只是在你机器下载的人他们的EM对你的积分,比如你开放的带宽大,小A在你那里下的很舒服,你就在小A那里的分数高。同样,小A那里也有一群人在下他的资料其中也有你,由于你开放的带宽多小A在你那里下的多,你在小A那里的积分就高,你就比其他在小A那里下载东西的人有优先下载小A资料的权限(小A可以设置高、普通这些的,设置高的时候就只有积分高的人优先下了)。

自己是无法看自己的积分的,因为这个积分不是永恒的,只是暂时针对一个文件的。

14)好友通道问题

我说明一点,加为好友开通通道,起到的作用只是,可以缩短你的排队时间,使你的信用积分突然变大,此外没有任何作用,他和速度没有本质的联系。

15)tag问题

好多朋友到现在也不明白为什么要有个[chn]有个[VeryCD],这个有什么用,其实这个名称是任意的,甚至重名都没有问题,因为p2p世界里面判断你的标志是userhash,而不是用户名,用户名你随便改,一天一个新名字也不会影响你的积分,tag的作用是为了让一些服务器判断,从而可以连接该服务器,有的服务器就是规定了如果你不加[*****]就是不让你连接,所以就加上他连接方便点,另外有的mod可以实现对有相关[****]进行加分,比如我们vc版本对有[chn]的朋友就有固定的加分设置,它可以使所有有这个[chn]的朋友积分比没有这个的人多,从而达到中国人优先下载优先上传的问题,当然了这个问题,现在在世界范围内,仍是一个争论的话题,到底是否应该加分,大家也是众说纷纭。其实,懂行的朋友可以自己设置加分,可以随心所欲给任何[*****]加分减分,也可以给任意userhash加分减分,以达到优先上传优先下载的目的,甚至可以达到任意ban人的目的。当然了,这个问题不合适公开讨论,有违背p2p的根本,这里点到为止。

16)对于如何隐藏emule头像的问题

对于一些在公司工作的朋友,这一直是一个困扰很久的问题,如何还能下载,还不让老板发现。这里我说两个解决方案

(1)使用第三方软件解决 可以使用SysTrayX软件,这个软件,国内大型软件站都有下载,它是一个管理系统托盘的软件,非常简单,具体使用方法,大家一看就明白了,他可以做到隐藏emule头像的问题,

(2)使用系统服务解决 我们知道在2000以上系统中都有srvany服务,借助这个服务,也可以实现隐藏头像 不借助第三方软件 同样server系统可以用终端服务来实现隐藏头像,另外还可以借助instsrv服务来实现隐藏头像,原理和前面一样,其实就是一个东西,这种方法原理,常见于一些黑客网站,其实有些木马软件,或者后台软件,就是用的这个方案。大家有兴趣可以上一些黑客网站研究研究。

17)关于emule和bt的相关问题

好多朋友都在使用bt的同时,也在使用emule,我这里说一点,对于bt文件,如果我们下到了一半,没有种了,或者非常慢,我们可以把它导入emule下载,用dmTorrent2Par和Jcd2Met或者 Edonkeydoctor或者MetFileRegenerator,都可以实现该功能,很简单,另外emule的文件同样也可以导入bt进行下载,二者可以相互转换。为什么要说这一点呢,是要提醒大家,其实有好多emule的辅助工具,都可以帮我们更好的使用emule,它不是孤立的,只不过国内兴起的比较晚,目前来看,只要edonkey能用的相关软件,emule都能使用。比如,关于重建met的edonkeydoctor软件,就可以使一些下载了很多的错误文件,直接进行修复而不是像以前那样把辛苦下到的删掉。是我们遇到问题需要关闭的时候,不用再担心要删除文件了

⑶ C#怎样实现语音聊天视频功能(要具体代码)

给你一个winform 的例子,对你可能有用!

涉及技术
动态调用Com对象(全反射、没有引用com ocx)
取得系统存在的各种语言引擎
使用引擎进行朗读
使用引擎进行保存声音

程序图列:

主要功能描述
实列变量等,构造函授等

取得所有的 识别对象模块集合,放入下拉框

代码

object _spVoiceCls =
null; //保存朗读用的 SAPI.SpVoice

const
int SpFlags =
1; //SpeechVoiceSpeakFlags.SVSFlagsAsyn

object _oISpeechObjectTokens =
null; //保存 SAPI.ISpeechObjectTokens 就是系统有的语音引擎集合

int TokensCount =
0; // 语音引擎集合 数
DictionaryEntry[] _deTokens=null; //榜定下拉框用的

public MainForm()
{
InitializeComponent();
this.HandleDestroyed +=
new EventHandler(Form1_HandleDestroyed);
}

private
void Form1_Load(object sender, EventArgs e)
{

InitSAPI();

}

系统事件:程序加载

取得所有的 识别对象模块集合,放入下拉框

代码

void InitSAPI()
{
//创建语音对象朗读用
_spVoiceCls = CreateComObject("SAPI.SpVoice");

if (_spVoiceCls == null)
{

MessageBox.Show("您的系统没有,微软语音组件");
Application.Exit();
}
else
{//取得所有的 识别对象模块集合

_oISpeechObjectTokens = CallComMethod("GetVoices", _spVoiceCls); //取得SAPI.ISpeechObjectTokens
//识别对象集合 Count;
object r = GetComPropery("Count", _oISpeechObjectTokens);
if (r is int)
{

TokensCount = (int)r;

if (TokensCount > 0)
{
//取得全部语音识别对象模块,及名称,以被以后使用
_deTokens = new DictionaryEntry[TokensCount];
for (int i = 0; i < TokensCount; i++)
{
//从集合中取出单个 识别对象模块
object oSpObjectToken = CallComMethod("Item", _oISpeechObjectTokens, i); //返回 SAPI.SpObjectToken
//取名称
string Description = CallComMethod("GetDescription", oSpObjectToken) as string;
//放到 DictionaryEntry 对象中,key 是 识别对象模块,value 是名称
_deTokens= new DictionaryEntry(oSpObjectToken, Description);

}
//邦定到 下拉框
cboxTokens.DisplayMember = "Value";
cboxTokens.ValueMember = "Key";
cboxTokens.DataSource = _deTokens;
cboxTokens.SelectedIndex = 0;
}

}

}

}

用户事件:朗读

朗读输入的文本信息

代码

private void btnSynthesis_Click(object sender, EventArgs e)
{
string msg = rTxtMsg.Text.Trim();
if (msg.Length != 0)
{

if (_spVoiceCls != null)
{

//设置语言引擎
SetComProperty("Voice", _spVoiceCls, cboxTokens.SelectedValue);
//调用Speak 函数,msg 是要播放的文本,1 是异步播放,因为是异步的 com 对象不立刻释放
CallComMethod("Speak", _spVoiceCls, msg, SpFlags);

}
}

}

用户事件:保存声音

将输入的文本信息生成音频文件保存到文件

代码

private void Save()
{
string msg = rTxtMsg.Text.Trim();
if (msg.Length != 0)
{
using (SaveFileDialog sfd = new SaveFileDialog())
{
sfd.Filter = "wav 文件 (*.wav)|*.wav";
sfd.RestoreDirectory = true;
if (sfd.ShowDialog() == DialogResult.OK)
{
/*
Enum SpeechStreamFileMode;
SSFMOpenForRead = 0;
SSFMOpenReadWrite = 1;
SSFMCreate = 2;
SSFMCreateForWrite = 3;

*/

int SpFileMode = 3;// SpeechStreamFileMode.SSFMCreateForWrite

object oSpFileStream = CreateComObject("SAPI.SpFileStream"); //创建 SAPI.SpFileStream

object oSpVoice = CreateComObject("SAPI.SpVoice"); //创建 SAPI.SpVoice

try
{
CallComMethod("Open", oSpFileStream, sfd.FileName, SpFileMode, false); //打开流
SetComProperty("Voice", oSpVoice, cboxTokens.SelectedValue); //设置 Voice 属性,让谁朗读
SetComProperty("AudioOutputStream", oSpVoice, oSpFileStream); //设置流

CallComMethod("Speak", oSpVoice, msg, SpFlags); //调用 Speak

CallComMethod("WaitUntilDone", oSpVoice, Timeout.Infinite); //等
CallComMethod("Close", oSpFileStream); //关闭流

MessageBox.Show("保存成功");
}
finally
{
Marshal.ReleaseComObject(oSpVoice);
Marshal.ReleaseComObject(oSpFileStream);
}

}

}
}

}
private void btnSave_Click(object sender, EventArgs e)
{

try
{
btnSave.Enabled = false;
Save();

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
btnSave.Enabled = true;
}

}

调用com组件,功能函数

自己写的一些帮助函数可以方便调用反射,要不太郁闷(如果是VB 就不用如此费尽了)

#region 调用com组件,功能通用函数
/// <summary>
/// 设置属性
/// </summary>
/// <param name="name"></param>
/// <param name="o"></param>
/// <param name="vlaue"></param>
private static void SetComProperty(string name, object o, object vlaue)
{
Type t = o.GetType();
t.InvokeMember(name, BindingFlags.Instance | BindingFlags.SetProperty, null, o, new
object[] { vlaue });
}
/// <summary>
/// 取得属性
/// </summary>
/// <param name="name"></param>
/// <param name="o"></param>
/// <returns></returns>
private static object GetComPropery(string name, object o)
{
Type t = o.GetType();
return t.InvokeMember(name, BindingFlags.Instance | BindingFlags.GetProperty, null, o, null);
}
/// <summary>
/// 调用方法函授
/// </summary>
/// <param name="name"></param>
/// <param name="o"></param>
/// <param name="parms"></param>
/// <returns></returns>
private static object CallComMethod(string name, object o, params object[] parms)
{
Type t = o.GetType();

return t.InvokeMember(name, BindingFlags.Instance | BindingFlags.InvokeMethod, null, o, parms);
}
/// <summary>
/// 创建 com 对象
/// </summary>
/// <param name="FromProgID"></param>
/// <returns></returns>
private static object CreateComObject(string FromProgID)
{
Type comType = Type.GetTypeFromProgID(FromProgID);
object rVar = null;
if (comType != null)
rVar = System.Activator.CreateInstance(comType);

return rVar;
}
#endregion

释放com对象
很简单的就一行即可

代码
void Form1_HandleDestroyed(object sender, EventArgs e)
{
//释放com对象
Marshal.ReleaseComObject(_spVoiceCls);

}

热点内容
招标服务器云 发布:2024-05-19 20:04:19 浏览:583
搭建小米云服务器 发布:2024-05-19 19:43:17 浏览:130
苹果手机备忘录怎么加密 发布:2024-05-19 18:57:57 浏览:16
光荣脚本 发布:2024-05-19 18:57:48 浏览:997
pythonjson字符串 发布:2024-05-19 18:51:43 浏览:253
什么是服务器厂商介绍 发布:2024-05-19 18:50:09 浏览:371
服务器网卡硬件型号怎么看 发布:2024-05-19 18:36:41 浏览:666
修改pve服务器ip 发布:2024-05-19 18:31:52 浏览:469
微信密码忘记了如何取出里面的钱 发布:2024-05-19 18:27:35 浏览:330
vs2005反编译 发布:2024-05-19 18:26:34 浏览:364