??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲VA中文字幕无码毛片,亚洲偷偷自拍高清,亚洲国模精品一区http://m.tkk7.com/john_yu/正在学习中:Q?/description>zh-cnSun, 11 May 2025 08:12:28 GMTSun, 11 May 2025 08:12:28 GMT60bcb6 中安?boosthttp://m.tkk7.com/john_yu/archive/2008/12/07/244898.htmljohnjohnSun, 07 Dec 2008 13:22:00 GMThttp://m.tkk7.com/john_yu/archive/2008/12/07/244898.htmlhttp://m.tkk7.com/john_yu/comments/244898.htmlhttp://m.tkk7.com/john_yu/archive/2008/12/07/244898.html#Feedback0http://m.tkk7.com/john_yu/comments/commentRss/244898.htmlhttp://m.tkk7.com/john_yu/services/trackbacks/244898.html
正则表达式是一U模式匹配Ş式,它通常用在处理的文本程序中。比如我们经怋用的grep工具Q还是perl语言都用了正则表达式。传l的C++处理正则表达式是非常ȝ的,q也成ؓ很多其他语言爱好者的W柄Q现在情况不一样了Q因为有了boost?/font>
Boost是一个基于Template的开发源代码库,在这个库中有很多子库用来高效处理各方面的问题Q比如字W串拆分Q格式化Q线E等{,Boost对于每一个C++爱好者都是应该了解的Q对于C++ Builder用户如果能在熟练使用VCL的情况下再熟l用BoostQ我想一定如虎添{?/font>
一般来_使用Boost是非常简单,和用其他STL库没有太大区别,但用Boost的正则表辑ּ库则不那么容易,因ؓq个库还需要我们单独编译,下面我将详细介绍如何使用?/font>
如果你还不知道或者还没有Boost的话Q你可以?a style="text-decoration: none; color: #336699; ">www.boost.org下蝲最新版本,作者用的?.30版本。将下蝲下来的zip?/font>[1]解压CQ何你喜欢的目录,比如D:\boost?/font>
~译正则表达式库
前面已经提到Q这个库需要我们单独编译才能用,Z么不~译好一起发布呢Q主要是考虑C同的~译器需要不同的链接库文件和链接库太大了。在命o行下Q进入[%Boost]\Libs\RegEx\Build目录Q直接敲入make –fbcb6.mak命o开始编译,q里请大家注意了Q如果你的计机上同时安装了BCB5Q请一定要把path讄成ؓBCB6的bcc32.exeE序所在的目录Q否则可能用BCB5的makeE序Q这栯然能~译但最后不能用?br /> ~译q程相当耗时Q你需要耐心{待Q最l编译完成,会在[%Boost]\Libs\RegEx\Build目录生成一个BCB6目录Q在q个目录生成了很多lib文g和dll文gQ把所有dll文g复制到windowspȝ目录Q所以lib文g复制到bcb6\lib目录。如果你不想q么ȝ的复制文Ӟ可以在编译时加入install参数Q就像这样make –fBcb6.mak installQ不q作者还是比较喜Ƣ前一U方式,q样我可以知道到底生成了什么文件。现在编译已l完成了Q你可以体现boost的神奇魅力了?/font>
#include<deque>
#include<iostream>
#include<algorithm>
#include<boost/regex.hpp>
int main()
{
using namespace boost;
using namespace std;
regex expression("\\s+href\\s*=\\s*\"([^\"]*)\"",regbase::normal|regbase::icase);
string s="<a href=\"index.html\"><img src=\"logo.gif\"></a>";
deque<string> result;
regex_split(std::back_inserter(result),s,expression);
copy(result.begin(),result.end(),ostream_iterator<string>(cout,"\n"));
int c;
cin>>c;
return 0;
}
讄BCB6 Project属性的Lib Path和Include PathZ安装boost的目录,q行你会看到l果Q?br /> index.html
可以看到index.html已经从字W串中提出出来了Q那么ؓ什么会是这样呢Q?br /> 代码的核心部分是Q?br /> regex expression("\\s+href\\s*=\\s*\"([^\"]*)\"",regbase::normal|regbase::icase);
它用来设|如何匹配字W串Q上面ؕ七八p的字符串很隄懂,如果不了解正则表辑ּ的书写规则,?br /> 面代码可以和天书媲美?br /> regbase::normal|regbase::icase 是解析参数设|,具体可以参考boost帮助文档?br /> 正则表达式的书写规则
具体的书写规则,大家可以参看boost的文档,我这里做一下简要说明:
. (dot)
用来匚wM一个字W,但不包括新行上的字符
*
闭包QQ意有限次的自重复q接
+
有限ơ自重复q接Q但臛_出现一?br /> {}
指定可能的重复次?br /> 例如Q?br /> ba* 匚w b ba baa baaa{?br /> ba+ 匚w ba baa baaaaaaaaa{?br /> ba{1,5} 匚w ba baa baaa baaaa baaaaa
\
转义字符Q有很多用途,Ҏ参数讄而变化,最常见的就是类gc语言\的用?br /> \s
匚wI格
\w
匚w一个单?br /> \d
匚w数字
()
有两U用法:
1是合q的作用Q例?ab)*匚wab abab ababab{?br /> 2是确定匹配,也就是说?)中的字符被最l拆解出?br /> Ҏ上面q张表,我们可以很容易知道前面的那段天书如何解释?/div>
一个实际的例子
前一D|间在CSDN上有一帖子,问题是有一U文件结构如Q类|Q?br /> @People{
Age=19
Speek=”Hay,{name},how are you”
}
问如何拆分字W串得到@后面的名字,=两边的属性名和属性|引号里{}U的名字?br /> 解决q个问题用正则表辑ּ再合适不q了?br /> Ҏ分析Q我们可以这h造匹配规则:
"@(.*?)\s*\\{" 匚w@开始的字符创,后面两种cd如何构造匹配规则留l大家思考吧?br /> q样我们可以L拆解q个例子?br />
性能分析
通过上面的讨论,大家已经了解到boost的强大威力,那个性能又如何呢Qؓ此我们再实际来拆分一?br /> 复杂的html代码Q看看到底需要花费多时间?br /> Z节省幅Q这里就不列出html代码了,不过可以告诉大家Q这是一个又Word生成的大ؓ186K
的html文gQ这个文件中用到了很?lt;table>标签Q所以我q里试来拆分所?lt;table>标签?br /> width属性。测试代码如下:
#include<deque>
#include<iostream>
#include<algorithm>
#include<boost/regex.hpp>
#include<vcl.h>
int main()
{
 using namespace boost;
 using namespace std;
 TStringList* html=new TStringList();
 html->LoadFromFile("D:\\1.htm");
 regex expression("\\s+width=([^\"]*)\s+",regbase::normal|regbase::icase);
DWORD start=GetTickCount();
 for(int n=0;n<html->Count;n++)
 {
    string s=html->Strings[n].c_str(); 
    deque<string> result;
    regex_split(std::back_inserter(result),s,expression);
copy(result.begin(),result.end(),ostream_iterator<string>(cout,"\n"));
result.clear();
}
 start=GetTickCount()-start;
 delete html;
 cout<<start;
int c;
 cin>>c;
 return 0;
}
输出l果?71毫秒Q拆分得?072个width属性|我们可以看到boost的效率是非常高的Q虽然与一些角本语a比v来解析速度q是慢,但已l可以满_多数~程要求了。另外作者的计算机配|ƈ不是非常高,怿拿到现在M一C配|的计算Z都会优于作者的l果?br /> l束?br />
其实上面的强大威力只是boost的冰׃角,如果你不自己M会,你很难想象到boost的强大威力。在boost里还有很多用的库,比如格式化输出,字符串拆解,cd转换{,q些库用v来也比较方便Q大家可以自行参考boost文档。在q些库中q有两个库需要自行编译,他们是Python和thread库,而且q些库的~译需要专门的工具JamQ所以我们在~译q些库的时候还要编译jam工具Q而编译jam工具也不是一件快乐的事情Q麻烦同样出现在如果你安装了多个~译器,如果读者有兴趣可以自己试一下?/div>
不过BCB6q不支持全部boost库,从boost提供的编译器支持表可以看到[2]QBCB6q是有相当多的库不支持的Q支持最好的是gcc/g++的编译器Q但也不是全部支持。希望borland下一个将要发布的C++~译器可以支持更多C++标准?/div>
[1] 其实q有其他cd的包Q但在windowspȝ下,你最好下载zip?/div>
[2] Boost提供的编译器支持表是针对BCB5的,对于BCB6的支持作者ƈ没有详细试Q如果读者有兴趣可以自己试boost附带的测试代码?/div>



john 2008-12-07 21:22 发表评论
]]>RedHat LinuxAS4 cvs 服务器搭建步?/title><link>http://m.tkk7.com/john_yu/archive/2008/05/25/202672.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Sat, 24 May 2008 18:04:00 GMT</pubDate><guid>http://m.tkk7.com/john_yu/archive/2008/05/25/202672.html</guid><wfw:comment>http://m.tkk7.com/john_yu/comments/202672.html</wfw:comment><comments>http://m.tkk7.com/john_yu/archive/2008/05/25/202672.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/john_yu/comments/commentRss/202672.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/john_yu/services/trackbacks/202672.html</trackback:ping><description><![CDATA[<p>Ҏ|上各种文档整理而成.=号两边要I格的问题折了我好?</p> <p> </p> <p>1:安装</p> <p>先检查是否安装CVS?/p> <p>#>rpm -qa|grep cvs</p> <p>没有安装的话,用下?U方法安?/p> <p>(1):在安装linux的时候可以选择安装CVS?br /> (2):另外下蝲CVS RPM?自行安装</p> <p>2:建立cvs用户和组</p> <p>#> groupadd cvs<br /> #> useradd -g cvs -G cvs –d /cvsroot cvsroot <br /> #> passwd cvsroot </p> <p>更改目录属?br /> chmod –R 770 /cvsroot <br /> </p> <p>3:建立CVS服务</p> <p>#more /etc/services | grep cvspserver</p> <p>看看是否?<br /> cvspserver 2401/tcp #CVS client/server operations <br /> cvspserver 2401/udp #CVS client/server operations</p> <p>如果没有需要到/etc/service文g中增?/p> <p>建立#vi /etc/xinet.d/cvspserver 文g内容如下</p> <p>service cvspserver <br /> { <br /> disable = no <br /> flags = REUSE <br /> socket_type = stream <br /> wait = no <br /> user = root <br /> server = /usr/bin/cvs <br /> server_args = -f --allow-root=/cvsroot pserver <br /> }</p> <p>该文件有特别要注意的地方,所?号两辚w需要空一个空?除了"root=/cvsroot" 所有要I格的地?不要多加I格.否则会有CVS服务不能启动的问?/p> <p>切换到cvsroot用户</p> <p>#cvs -d /cvsroot init</p> <p>然后重新启动xinetd服务或者重启动机器</p> <p>#service xinetd restart</p> <p>然后?/p> <p>#netstat -l | grep cvspserver<br /> or<br /> #netstat -l | grep 2401</p> <p>看是否有下面tcp 0 0 *:cvspserver *:* LISTEN</p> <p>说明已经正常启动Q没有的话请重新查配|过E是否有错误或者遗漏。最后还必须查防火墙的设|,?401端口打开?/p> <p>4:用户理</p> <p>CVS默认使用pȝ用户d,所有系l用户都可以登陆,但是q样对系l不安全,我们需要独立的用户理.CVS用户名和密码保存在CVSROOT目录下的passwd文g?格式</p> <p>用户?密码:pȝ用户</p> <p>#htpasswd passwd username</p> <p>用来讄用户密码q保存到passwd文g?</p> <p>然后需要关闭系l用L陆用cvs的权?CVSROOT目录下的config文g,?SystemAuth=no?L可以了.</p> <p>试登陆</p> <p>#cvs -d “:pserver:username@127.0.0.1:/cvsroot” login</p> <p>ok</p> <p> </p> <p>5 :源代码仓库的备䆾和移?<br /> 基本上,CVS的源代码仓库没有什么特别之处,完全可以用文件备份的方式q行备䆾。需要注意的只是Q应该确认备份的q程中没有用h交修改,具体的做法可以是停止CVS服务器或者用锁{等。恢复时只需要把q些文g按原来的目录l构存放好,因ؓCVS的每一个模块都是单独的一个目录,与其他模块和目录没有M瓜葛Q相当方ѝ甚臛_需要在仓库中删除一个目录或者文Ӟ便可以删除该模块的一些内容,不过q不q么做,使用CVS的删除功能将会有一个历史记录,而对仓库的直接删除不留Q何痕q,q对目理是不利的。移动仓库与备䆾怼Q只需要把该模块的目录Ud到新的\径,便可以用了?<br /> 如果不幸在备份之后有q一些修改ƈ且执行了提交Q当服务器出现问题需要恢复源代码仓库Ӟ开发者提交新的修改就会出现版本不一致的错误。此时只需要把CVS相关的目录和文g删除Q即可把新的修改提交?<br /> <br /> 6Q更q一步的理 <br /> CVSROOT目录下还有很多其他功能,其中最重要的就是modules文g。这个文件定义了源代码库的模块,下面是一个例子: <br /> <br /> <table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"> <tbody> <tr> <td><span id="6s6qcqa" class="genmed"><strong>代码:</strong></span></td> </tr> <tr> <td class="code">Linux    Linux <br /> Kernel   Linux/kernel</td> </tr> </tbody> </table> <span id="o8uc84e" class="postbody"><br /> <br /> q个文g的内Ҏ行排列,每一行定义一个模块,首先是模块名Q然后是模块路径Q这是相对于CVS根目录的路径。它定义了两个模块,W一个是Linux模块Q它位于Linux目录中,W二个是Kernel模块Q这是Linux模块的子模块?<br /> modules文gq必须的,它的作用相当于一个烦引,部分CVS客户端Y仉过它可以快速找到相应的模块Q比如WinCVS?<br /> <br /> 7Q协同开发的问题 <br /> 默认方式下,CVS允许多个用户~辑同一个文Ӟq对一个协作良好的团队来说不会有什么问题,因ؓ多个开发者同时修改同一个文件的同一部分是不正常的,q在目理中就应该避免Q出现这U情况说明项目组内部没有l一意见。而多个开发者修Ҏ件的不同部分QCVS可以很好的管理?<br /> 如果觉得q种方式难以控制QCVS也提供了解决办法Q可以用cvs admin -lq行锁定Q这样一个开发者正在做修改时CVS׃会允许其他用户checkout。这里顺便说明一下文件格式的问题Q对于文本格式,CVS可以q行历史记录比较、版本合q等工作Q而二q制文g不支持这个操作,比如word文档、图片等应该以二进制方式提交。对于二q制方式Q由于无法进行合qӞ在无法保证只有一个用户修Ҏ件的情况下,使用加锁方式q行修改。必L意的是,修改完毕记得解锁?<br /> ?.6版本开始,CVS引入了监视的概念Q这个功能可以让用户随时了解当前谁在修改文gQƈ且CVS可以自动发送邮件给每一个监视的用户告知最新的更新?<br /> <br /> 8Q徏立多个源代码仓库 <br /> 如果需要管理多个开发组Q而这些开发组之间不能互相讉KQ可以有2个办法: <br /> aQ共用一个端口,需要修改cvspserver文gQ给server_args指定多个源代码\径,卛_个—allow-root参数。由于xinetd的server_args长度有限Ӟ可以在cvspserver文g中把服务器的讄重定向到另外一个文Ӟ如: <br /> <br /> </span> <table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"> <tbody> <tr> <td><span id="8gmyo4c" class="genmed"><strong>代码:</strong></span></td> </tr> <tr> <td class="code">server = /home/cvsroot/cvs.run</td> </tr> </tbody> </table> <span id="8aiukk4" class="postbody"><br /> <br /> 然后创徏/home/cvsroot/cvs.run文gQ该文g必须可执行,内容格式为: <br /> <br /> </span> <table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"> <tbody> <tr> <td><span id="ukgc8oe" class="genmed"><strong>代码:</strong></span></td> </tr> <tr> <td class="code">#!/bin/bash <br /> /usr/bin/cvs -f \ <br /> --allow-root=/home/cvsroot/src1 \ <br /> --allow-root=/home/cvsroot/src2 \ <br /> pserver</td> </tr> </tbody> </table> <span id="qcmq844" class="postbody"><br /> <br /> 注意此时源代码仓库不再是/home/cvsrootQ进行初始化的时候要分别对这两个仓库路径q行初始化,而不再对/home/cvsroot路径q行初始化?<br /> bQ采用不同的端口提供服务 <br /> 重复W?步和W?步,Z同的源代码仓库创Z同服务名的启动脚本,qؓq些服务名指定不同的端口Q初始化时也必须分别q行初始化?/span> <span id="4yk46wy" class="postbody"><br /> <script type="text/javascript"><!-- google_ad_client="pub-3152530285624674" ; google_ad_width="468; google_ad_height" = 15; google_ad_format="468x15_0ads_al" ; google_ad_channel="" ; //--></script><script src="中国Linux公社 -viewtopic-Red Hat Linux 8_0?_0上设|CVS服务?files/show_ads.js" type="text/javascript"> </script></span> </p> <p> </p> <p> </p><img src ="http://m.tkk7.com/john_yu/aggbug/202672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/john_yu/" target="_blank">john</a> 2008-05-25 02:04 <a href="http://m.tkk7.com/john_yu/archive/2008/05/25/202672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 内存分配http://m.tkk7.com/john_yu/archive/2008/01/28/178286.htmljohnjohnMon, 28 Jan 2008 15:58:00 GMThttp://m.tkk7.com/john_yu/archive/2008/01/28/178286.htmlhttp://m.tkk7.com/john_yu/comments/178286.htmlhttp://m.tkk7.com/john_yu/archive/2008/01/28/178286.html#Feedback0http://m.tkk7.com/john_yu/comments/commentRss/178286.htmlhttp://m.tkk7.com/john_yu/services/trackbacks/178286.html

 Oracle 内存分配
关于SGA讄的一Ҏȝ
本ȝ不针对特例,仅对服务器只存在OS + ORACLE ZQ如果存在其他应用请酌情考虑
写这个也是因来这U重复性的问题发生的太多所D?br />
首先不要q信STS,SG,OCP,EXPERT {给出的M、内存百分比的说?br /> 基本掌握的原则是Q?data buffer 通常可以可能的大,shared_pool_size 要适度Qlog_buffer 通常大到几百K?M差不多?br />
讄之前Q首先要明确2个问?br /> 1Q?除去OS和一些其他开销Q能lORACLE使用的内存有多大
2Qoracle?4bit or 32 bit,32bit 通常 SGA?1.7G 的限?某些OS的处理或者WINDOWS上有特定讑֮可以支持?G以上甚至辑ֈ3.7GQ本人无q方面经?

下面是我的windows2000下的oracle :

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
PL/SQL Release 8.1.7.0.0 - Production
CORE 8.1.7.0.0 Production
TNS for 32-bit Windows: Version 8.1.7.0.0 - Production
NLSRTL Version 3.4.1.0.0 - Production

SQL>

windows上存?2bit的限Ӟ如AIX、HP UNIX {有明确?4BIT OS and ORACLE的版本,32bit oracle可以装在64bit os 上,64 bit oracle不能装在32 bit OS?br />
不管oracle?2 bit ORACLEq是 64 bit ?假定应用存在没有很好的用bind var 的情况,也不能设|?shared_pool_size q大Q通常应该控制?00M--300M,如果?ORACLE ERP 一cȝ使用了很多存储过E函数、包 Q或者很大的pȝQ可以考虑增大shared_pool_size ,但是如果过500M可能是危险的Q达?G可能会造成CPU的严重负担,pȝ甚至瘫痪。所以shared_pool_size 如果过300Mq命中率不高Q那么应该从应用上找原因而不是一味的增加内存Qshared_pool_size q大主要增加了管理负担和latch 的开销?br />
log_buffer : 128K ---- 1M 之间通常问题不大Q不应该太大

large_pool_size :如果不设|MTSQ通常?RMAN 、OPQ 会用到Q但是在10M --- 50M 应该差不多了。假如设|?MTS,则由?UGA 攑ֈlarge_pool_size 的缘故,q个时候依?session最大数量和 sort_ares_size {参数设|,必须增大large_pool_size 的设|,可以考虑?session * (sort_area_size + 2M)。这里要提醒一点,不是必须使用MTSQ我们都不主张用MTSQ尤其同时在U用h于500的情况下?br />
java_pool_size : 若不使用javaQ给30M通常够?br />
data buffer ,在做了前面的讄后,凡可以提供给oracle的内存,都应该给data buffer = (db_block_size * db_block_buffers)
?i 中可以是 db_cache_size

q有2个重要参数我们需要注?br />
sort_area_size and hash_area_size
q两个参数在非MTS下都是属于PGA Q不属于SGA,是ؓ每个session单独分配的,在我们的服务器上除了OS + SGA,一定要考虑q两部分

(****) : OS 使用内存+ SGA + session*(sort_area_size + hash_area_size + 2M) < ȝ理RAM 为好


q样归结q来Q假定oracle?32 bit ,服务器RAM大于2G Q注意你的PGA的情况,,则徏?br />
shared_pool_size + data buffer +large_pool_size + java_pool_size < 1.6G


再具体化Q注意满上?****) 的原则的基础上可以参考如下设|?br /> 如果512M RAM
shared_pool_size = 50M, data buffer = 200M

如果1G RAM
shared_pool_size = 100M , data buffer = 500M

如果2G
shared_pool_size = 150M ,data buffer = 1.2G

物理内存再大已经跟参数没有关pM


假定64 bit ORACLE

内存4G
shared_pool_size = 200M , data buffer = 2.5G

内存8G
shared_pool_size = 300M , data buffer = 5G

内存 12G
shared_pool_size = 300M-----800M , data buffer = 8G



以上仅ؓ参考|不同pȝ可能差异比较大,需要根据具体情况调整。徏议在讄参数的同Ӟinit中?lock_sga Q在不同的^C可能有不同的方式Q得SGA锁定在物理内存中而不被放?SWAP 中,q样Ҏ率有好处


关于内存的设|,要再q行l致的调_L作用不大Q但可根据statspack信息和v$system_event,v$sysstat,v$sesstat,v$latch {view信息来考虑微调


john 2008-01-28 23:58 发表评论
]]>Oracle 回滚D늩间回收步?/title><link>http://m.tkk7.com/john_yu/archive/2007/12/27/170768.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Wed, 26 Dec 2007 16:50:00 GMT</pubDate><guid>http://m.tkk7.com/john_yu/archive/2007/12/27/170768.html</guid><wfw:comment>http://m.tkk7.com/john_yu/comments/170768.html</wfw:comment><comments>http://m.tkk7.com/john_yu/archive/2007/12/27/170768.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/john_yu/comments/commentRss/170768.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/john_yu/services/trackbacks/170768.html</trackback:ping><description><![CDATA[     摘要:   是谁"偷偷?用了那么多空间呢(本来有几十个G的Free盘I间?? 查数据库表空间占用空间情? SQL> select tablespace_name,sum(bytes)/1024/1024/1024 GB  2 from dba...  <a href='http://m.tkk7.com/john_yu/archive/2007/12/27/170768.html'>阅读全文</a><img src ="http://m.tkk7.com/john_yu/aggbug/170768.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/john_yu/" target="_blank">john</a> 2007-12-27 00:50 <a href="http://m.tkk7.com/john_yu/archive/2007/12/27/170768.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用的MQ命ohttp://m.tkk7.com/john_yu/archive/2007/12/26/170644.htmljohnjohnWed, 26 Dec 2007 09:26:00 GMThttp://m.tkk7.com/john_yu/archive/2007/12/26/170644.htmlhttp://m.tkk7.com/john_yu/comments/170644.htmlhttp://m.tkk7.com/john_yu/archive/2007/12/26/170644.html#Feedback0http://m.tkk7.com/john_yu/comments/commentRss/170644.htmlhttp://m.tkk7.com/john_yu/services/trackbacks/170644.html最q在配置MQ,C了一些常用的MQ命o,如下:

创徏队列理?
crtmqm –q QMgrName
-q是指创徏~省的队列管理器

删除队列理?
dltmqm QmgrName

启动队列理?
strmqm QmgrName
如果是启动默认的队列理器,可以不带其名?

停止队列理?
endmqm QmgrName 受控停止

endmqm –i QmgrName 立即停止

endmqm –p QmgrName 强制停止

昄队列理?
dspmq –m QmgrName

q行MQ命o
runmqsc QmgrName
如果是默认队列管理器Q可以不带其名字

往队列中放消息
amqsput QName QmgrName
如果队列是默认队列管理器中的队列Q可以不带其队列理器的名字

从队列中取出消息
amqsget QName QmgrName
如果队列是默认队列管理器中的队列Q可以不带其队列理器的名字

启动通道
runmqchl –c ChlName –m QmgrName

启动侦听
runmqlsr –t TYPE –p PORT –m QMgrName

停止侦听
endmqlsr -m QmgrName

下面是在MQ环境中可以执行的MQ命o(卛_runmqsc环境下可以敲的命?

定义持久信队?
DEFINE QLOCALQQNAMEQ?DEFPSISTQYESQ?REPLACE

讑֮队列理器的持久信队?
ALTER QMGR DEADQQQNAMEQ?

定义本地队列
DEFINE QLQQNAMEQ?REPLACE

定义别名队列
DEFINE QALIAS(QALIASNAME) TARGQ(QNAME)

q程队列定义
DEFINE QREMOTEQQRNAMEQ?+
RNAMEQAAAQ?RQMNAMEQQMGRNAMEQ?+
XMITQQQTNAMEQ?

定义模型队列
DEFINE QMODELQQNAMEQ?DEFTYPEQTEMPDYNQ?

定义本地传输队列
DEFINE QLOCAL(QTNAME) USAGE(XMITQ) DEFPSIST(YES) +
INITQQSYSTEM.CHANNEL.INITQQ?
PROCESS(PROCESSNAME) REPLACE

创徏q程定义
DEFINE PROCESSQPRONAMEQ?+
DESCRQ?#8216;STRING’Q?
APPLTYPEQWINDOWSNTQ?
APPLICIDQ?#8217; runmqchl -c SDR_TEST -m QM_ TEST’Q?
其中APPLTYPE的值可以是QCICS、UNIX、WINDOWS、WINDOWSNT{?

创徏发送方通道
DEFINE CHANNELQSDRNAMEQ?CHLTYPEQSDRQ?
CONNAMEQ?#8216;100.100.100.215(1418)’Q?XMITQQQTNAMEQ?REPLACE
其中CHLTYPE可以是:SDR、SVR、RCVR、RQSTR、CLNTCONN、SVRCONN、CLUSSDR和CLUSRCVR?

创徏接收斚w道
DEFINE CHANNELQSDR_ TESTQ?CHLTYPEQRCVRQ?REPLACE

创徏服务器连接通道
DEFINE CHANNELQSVRCONNNAMEQ?CHLTYPEQSVRCONNQ?REPLACE

昄队列的所有属?
DISPLAY QUEUEQQNAMEQ?[ALL]

昄队列的所选属?
DISPLAY QUEUEQQNAMEQ?DESCR GET PUT
DISPLAY QUEUEQQNAMEQMAXDEPTH CURDEPTH

昄队列理器的所有属?
DISPLAY QMGR [ALL]

昄q程定义
DISPLAY PROCESSQPRONAMEQ?

更改属?
ALTER QMGR DESCRQ?#8216;NEW DESCRIPTION’Q?
ALTER QLOCALQQNAMEQ?PUTQDISABLEDQ?
ALTER QALIASQQNAMEQ?TARGQQTARGQNAMEQ?

删除队列
DELETE QLOCALQQNAMEQ?
DELETE QREMOTEQQRNAMEQ?

清除队列中的所有消?
CLEAR QLOCALQQNAMEQ?

以下是一些高U配|的命o:

amqmcert                  配置SSL证书

amqmdain                配置windows上的MQ服务

crtmqcvx                    转换数据

dmpmqaut                转储对象权限理

dmpmqlog                转储日志理

dspmq                         昄队列理?/p>

dspmqaut                  昄打开对象的权?/p>

dmpmqcap               昄处理E序定w和处理程序数

dspmqcsv                 昄命o服务器状?/p>

dspmqfls                   昄文g?/p>

dspmqtrc                   跟踪MQ输出(HP-UNIX LINUX Solaris)

dspmqrtn                   昄事务的详l信?/p>

endmqcsv                 停止队列理器上的命令服务器

strmqcsv                    启动队列理器上的命令服务器

endmqtrc                   停止跟踪

rcdmqimg                  向日志写对象的映?/p>

rcmqobj                      Ҏ日志中的映像重新创徏一个对?/p>

rsvmqtrn                     提交或逆序恢复事务

 




john 2007-12-26 17:26 发表评论
]]>
BCB UTF-8 格式转换 http://m.tkk7.com/john_yu/archive/2007/11/22/162433.htmljohnjohnThu, 22 Nov 2007 10:11:00 GMThttp://m.tkk7.com/john_yu/archive/2007/11/22/162433.htmlhttp://m.tkk7.com/john_yu/comments/162433.htmlhttp://m.tkk7.com/john_yu/archive/2007/11/22/162433.html#Feedback1http://m.tkk7.com/john_yu/comments/commentRss/162433.htmlhttp://m.tkk7.com/john_yu/services/trackbacks/162433.html 当然,BCB本n支持三U字?前两U可自动?后一U有函数:
String x; //GBK
WideString y; //unicode
UTF8String z; //utf8

x=y; //自动
y=x; //自动
z=AnsiToUtf8(x);
x=Utf8ToAnsi(z);


john 2007-11-22 18:11 发表评论
]]>
Oracle安装的一些问题收?/title><link>http://m.tkk7.com/john_yu/archive/2007/10/24/155670.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Wed, 24 Oct 2007 12:50:00 GMT</pubDate><guid>http://m.tkk7.com/john_yu/archive/2007/10/24/155670.html</guid><wfw:comment>http://m.tkk7.com/john_yu/comments/155670.html</wfw:comment><comments>http://m.tkk7.com/john_yu/archive/2007/10/24/155670.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/john_yu/comments/commentRss/155670.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/john_yu/services/trackbacks/155670.html</trackback:ping><description><![CDATA[     摘要: 在安装过E中出现的一些问题的解决办法。值得收藏与学习。比如在安装的时候如果有中文的\径则会出现类DL提示:加蝲数据库时出错QareasQueries Oracle的系l要? 企业版:CPU 最低PENTIUM 200M 推荐 PENTIUMIII 1G以上     内存 最?28M 推荐 512M     盘I间 pȝ?40M 安装?.5GQFAT32Q或2.75GQ?..  <a href='http://m.tkk7.com/john_yu/archive/2007/10/24/155670.html'>阅读全文</a><img src ="http://m.tkk7.com/john_yu/aggbug/155670.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/john_yu/" target="_blank">john</a> 2007-10-24 20:50 <a href="http://m.tkk7.com/john_yu/archive/2007/10/24/155670.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>东京爱情故事Q?/title><link>http://m.tkk7.com/john_yu/archive/2007/07/23/131950.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Mon, 23 Jul 2007 15:08:00 GMT</pubDate><guid>http://m.tkk7.com/john_yu/archive/2007/07/23/131950.html</guid><wfw:comment>http://m.tkk7.com/john_yu/comments/131950.html</wfw:comment><comments>http://m.tkk7.com/john_yu/archive/2007/07/23/131950.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/john_yu/comments/commentRss/131950.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/john_yu/services/trackbacks/131950.html</trackback:ping><description><![CDATA[<p>在经历了一D|间的赯v落落以后Q开始静下心来回近4q的往事,也想C把东京爱情故事下载了下来看。用?天时间把q部电视看完了。莉香的W容实让h感到阛_灿烂Q我觉得Ҏ大的错误Q是喜欢了本来就不属于她?#8220;丸子”。从故事一开始,可以知道,完治的心留在了同?#8220;里美”那里了,对于完治来说Q莉香的出现Q只是生命中的一个小插曌Ӏ?br></p><img src ="http://m.tkk7.com/john_yu/aggbug/131950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/john_yu/" target="_blank">john</a> 2007-07-23 23:08 <a href="http://m.tkk7.com/john_yu/archive/2007/07/23/131950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Bill Gates的一些评论,我喜?/title><link>http://m.tkk7.com/john_yu/archive/2007/07/23/131948.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Mon, 23 Jul 2007 14:55:00 GMT</pubDate><guid>http://m.tkk7.com/john_yu/archive/2007/07/23/131948.html</guid><wfw:comment>http://m.tkk7.com/john_yu/comments/131948.html</wfw:comment><comments>http://m.tkk7.com/john_yu/archive/2007/07/23/131948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/john_yu/comments/commentRss/131948.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/john_yu/services/trackbacks/131948.html</trackback:ping><description><![CDATA[比尔~盖茨最聪明的地方不是他做了什么,而是他没做什么。他可以做许许多多的事情Q却只专注在自己的操作系l,软g研发二不被市Z别的诱惑吸引?br><br>做h要谦卑,做事要学会不断找问题--比尔·盖茨<br>在真理面前的谦卑Q是比尔·盖茨一U内心态度Q远比外面的风光无限、备受世人崇敬更重要?br>有了在真理面前的谦卑Q就可以在这个Qw的世界中保持一颗安静的心灵Q有更大的创造力和媄响力?br><img src ="http://m.tkk7.com/john_yu/aggbug/131948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/john_yu/" target="_blank">john</a> 2007-07-23 22:55 <a href="http://m.tkk7.com/john_yu/archive/2007/07/23/131948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linuxpȝ环境下的Socket~程详细解析http://m.tkk7.com/john_yu/archive/2007/07/23/131945.htmljohnjohnMon, 23 Jul 2007 14:45:00 GMThttp://m.tkk7.com/john_yu/archive/2007/07/23/131945.htmlhttp://m.tkk7.com/john_yu/comments/131945.htmlhttp://m.tkk7.com/john_yu/archive/2007/07/23/131945.html#Feedback0http://m.tkk7.com/john_yu/comments/commentRss/131945.htmlhttp://m.tkk7.com/john_yu/services/trackbacks/131945.htmlLinuxpȝ环境下的Socket~程详细解析

什么是Socket

  Socket接口是TCP/IP|络的APIQSocket接口定义了许多函数或例程Q程序员可以用它们来开发TCP/IP|络上的应用E序。要学Internet上的TCP/IP|络~程Q必ȝ解Socket接口?

  Socket接口设计者最先是接口放在Unix操作pȝ里面的。如果了解Unixpȝ的输入和输出的话Q就很容易了解Socket了。网l的Socket数据传输是一U特D的I/OQSocket也是一U文件描q符。Socket也具有一个类g打开文g的函数调用Socket()Q该函数q回一个整型的Socket描述W,随后的连接徏立、数据传输等操作都是通过该Socket实现的。常用的Socketcd有两U:式SocketQSOCK_STREAMQ和数据报式SocketQSOCK_DGRAMQ。流式是一U面向连接的SocketQ针对于面向q接的TCP服务应用Q数据报式Socket是一U无q接的SocketQ对应于无连接的UDP服务应用?

  Socket建立

  Z建立SocketQ程序可以调用Socket函数Q该函数q回一个类g文g描述W的句柄。socket函数原型为:

  int socket(int domain, int type, int protocol);

  domain指明所使用的协议族Q通常为PF_INETQ表CZ联网协议族(TCP/IP协议族)Qtype参数指定socket的类型:SOCK_STREAM 或SOCK_DGRAMQSocket接口q定义了原始SocketQSOCK_RAWQ,允许E序使用低层协议Qprotocol通常赋?0"。Socket()调用q回一个整型socket描述W,你可以在后面的调用用它?/span>

  Socket描述W是一个指向内部数据结构的指针Q它指向描述W表入口。调用Socket函数Ӟsocket执行体将建立一个SocketQ实际上"建立一个Socket"意味着Z个Socket数据l构分配存储I间。Socket执行体ؓ你管理描q符表?/span>

  两个|络E序之间的一个网l连接包括五U信息:通信协议、本地协议地址、本C机端口、远端主机地址和远端协议端口。Socket数据l构中包含这五种信息?

  Socket配置

  通过socket调用q回一个socket描述W后Q在使用socketq行|络传输以前Q必配|该socket。面向连接的socket客户端通过调用Connect函数在socket数据l构中保存本地和q端信息。无q接socket的客L和服务端以及面向q接socket的服务端通过调用bind函数来配|本C息?
Bind函数socket与本Z的一个端口相兌Q随后你可以在该端口监听服务请求。Bind函数原型为:

  

int bind(int sockfd,struct sockaddr *my_addr, int addrlen); 
  Sockfd是调用socket函数q回的socket描述W? my_addr是一个指向包含有本机IP地址及端口号{信息的sockaddrcd的指针; addrlen常被讄为sizeof(struct sockaddr)?
  struct sockaddrl构cd是用来保存socket信息的:
  struct sockaddr {
   unsigned short sa_family; /* 地址族, AF_xxx */
char sa_data[14]; /* 14 字节的协议地址 */
};
  sa_family一般ؓAF_INETQ代表InternetQTCP/IPQ地址族;sa_data
则包含该socket的IP地址和端口号?
  另外q有一U结构类型:
  struct sockaddr_in {
   short int sin_family; /* 地址?*/
   unsigned short int sin_port; /* 端口?*/
   struct in_addr sin_addr; /* IP地址 */
   unsigned char sin_zero[8]; /* 填充0 以保持与struct sockaddr同样大小 */
  };

 

  q个l构更方便用。sin_zero用来sockaddr_inl构填充Cstruct sockaddr同样的长度,可以用bzero()或memset()函数其|ؓ零。指向sockaddr_in 的指针和指向sockaddr的指针可以相互{换,q意味着如果一个函数所需参数cd是sockaddrӞ你可以在函数调用的时候将一个指向sockaddr_in的指针{换ؓ指向sockaddr的指针;或者相反?

  使用bind函数Ӟ可以用下面的赋值实现自动获得本机IP地址和随取一个没有被占用的端口号Q?

  my_addr.sin_port = 0; /* pȝ随机选择一个未被用的端口?*/
  my_addr.sin_addr.s_addr = INADDR_ANY; /* 填入本机IP地址 */
通过my_addr.sin_port|ؓ0Q函C自动Z选择一个未占用的端口来使用。同P通过my_addr.sin_addr.s_addr|ؓINADDR_ANYQ系l会自动填入本机IP地址?/span>

  注意在用bind函数是需要将sin_port和sin_addr转换成ؓ|络字节优先序Q而sin_addr则不需要{换?/span>

  计算机数据存储有两种字节优先序Q高位字节优先和低位字节优先。Internet上数据以高位字节优先序在网l上传输Q所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时需要进行{换,否则׃出现数据不一致?/span>

  下面是几个字节顺序{换函敎ͼ

·htonl()Q把32位gL字节序{换成|络字节?
·htons()Q把16位gL字节序{换成|络字节?
·ntohl()Q把32位g|络字节序{换成L字节?
·ntohs()Q把16位g|络字节序{换成L字节?

 

  Bind()函数在成功被调用时返?Q出现错误时q回"-1"q将errno|ؓ相应的错误号。需要注意的是,在调用bind函数时一般不要将端口L为小?024的|因ؓ1?024是保留端口号Q你可以选择大于1024中的M一个没有被占用的端口号?

q接建立

 

  面向q接的客L序用Connect函数来配|socketq与q端服务器徏立一个TCPq接Q其函数原型为:

  int connect(int sockfd, struct sockaddr *serv_addr,int addrlen);
Sockfd是socket函数q回的socket描述W;serv_addr是包含远端主机IP地址和端口号的指针;addrlen是远端地质结构的长度。Connect函数在出现错误时q回-1Qƈ且设|errno为相应的错误码。进行客LE序设计无须调用bind()Q因U情况下只需知道目的机器的IP地址Q而客户通过哪个端口与服务器建立q接q不需要关心,socket执行体ؓ你的E序自动选择一个未被占用的端口Qƈ通知你的E序数据什么时候到打断口?/span>

  Connect函数启动和远端主机的直接q接。只有面向连接的客户E序使用socket时才需要将此socket与远端主机相q。无q接协议从不建立直接q接。面向连接的服务器也从不启动一个连接,它只是被动的在协议端口监听客Lh?

  Listen函数使socket处于被动的监听模式,qؓ该socket建立一个输入数据队列,到辄服务h保存在此队列中,直到E序处理它们?/span>

  int listen(int sockfdQ?int backlog);

  Sockfd是Socketpȝ调用q回的socket 描述W;backlog指定在请求队列中允许的最大请求数Q进入的q接h在队列中等待accept()它们Q参考下文)。Backlog寚w列中{待服务的请求的数目q行了限Ӟ大多数系l缺省gؓ20。如果一个服务请求到来时Q输入队列已满,该socket拒l连接请求,客户收C个出错信息?/span>

  当出现错误时listen函数q回-1Qƈ|相应的errno错误码?/span>

  accept()函数让服务器接收客户的连接请求。在建立好输入队列后Q服务器p用accept函数Q然后睡眠ƈ{待客户的连接请求?/span>

  int accept(int sockfd, void *addr, int *addrlen);

  sockfd是被监听的socket描述W,addr通常是一个指向sockaddr_in变量的指针,该变量用来存放提接请求服务的L的信息(某台L从某个端口发hQ;addrten通常Z个指向gؓsizeof(struct sockaddr_in)的整型指针变量。出现错误时accept函数q回-1q置相应的errno倹{?/span>

  首先Q当accept函数监视的socket收到q接hӞsocket执行体将建立一个新的socketQ执行体这个新socket和请求连接进E的地址联系hQ收到服务请求的初始socket仍可以l在以前?socket上监听,同时可以在新的socket描述W上q行数据传输操作?

  数据传输

  Send()和recv()q两个函数用于面向连接的socket上进行数据传输?

  Send()函数原型为:

  int send(int sockfd, const void *msg, int len, int flags);
Sockfd是你想用来传输数据的socket描述W;msg是一个指向要发送数据的指针QLen是以字节为单位的数据的长度;flags一般情况下|ؓ0Q关于该参数的用法可参照man手册Q?

  Send()函数q回实际上发送出的字节数Q可能会于你希望发送的数据。在E序中应该将send()的返回gƲ发送的字节数进行比较。当send()q回glen不匹配时Q应该对q种情况q行处理?
char *msg = "Hello!";
int len, bytes_sent;
……
len = strlen(msg);
bytes_sent = send(sockfd, msg,len,0);
……
  recv()函数原型为:

  int recv(int sockfd,void *buf,int len,unsigned int flags);

  Sockfd是接受数据的socket描述W;buf 是存放接收数据的~冲区;len是缓冲的长度。Flags也被|ؓ0。Recv()q回实际上接收的字节敎ͼ当出现错误时Q返?1q置相应的errno倹{?

  Sendto()和recvfrom()用于在无q接的数据报socket方式下进行数据传输。由于本地socketq没有与q端机器建立q接Q所以在发送数据时应指明目的地址?
  Sendto()函数原型为:
  int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sockaddr *to, int tolen);

  该函数比send()函数多了两个参数Qto表示目地机的IP地址和端口号信息Q而tolen常常被赋gؓsizeof (struct sockaddr)。Sendto 函数也返回实际发送的数据字节长度或在出现发送错误时q回-1?

  Recvfrom()函数原型为:

  int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen);

  from是一个struct sockaddrcd的变量,该变量保存源机的IP地址及端口号。fromlen常置为sizeof (struct sockaddr)。当recvfrom()q回Ӟfromlen包含实际存入from中的数据字节数。Recvfrom()函数q回接收到的字节数或当出现错误时q回

  1Qƈ|相应的errno?

  如果你对数据报socket调用了connect()函数Ӟ你也可以利用send()和recv()q行数据传输Q但该socket仍然是数据报socketQƈ且利用传输层的UDP服务。但在发送或接收数据报时Q内怼自动Z加上目地和源地址信息?

  l束传输

  当所有的数据操作l束以后Q你可以调用close()函数来释放该socketQ从而停止在该socket上的M数据操作Q?

  close(sockfd);

  你也可以调用shutdown()函数来关闭该socket。该函数允许你只停止在某个方向上的数据传输,而一个方向上的数据传输l进行。如你可以关闭某socket的写操作而允许l在该socket上接受数据,直至d所有数据?

  int shutdown(int sockfd,int how);

  Sockfd是需要关闭的socket的描q符。参?how允许为shutdown操作选择以下几种方式Q?
·0-------不允许l接收数?
·1-------不允许l发送数?
·2-------不允许l发送和接收数据Q?
·均ؓ允许则调用close ()

  shutdown在操作成功时q回0Q在出现错误时返?1q置相应errno?/span>

 面向q接的Socket实例

 

  代码实例中的服务器通过socketq接向客L发送字W串"Hello, you are connected!"。只要在服务器上q行该服务器软gQ在客户端运行客戯YӞ客户端就会收到该字符丌Ӏ?

  该服务器软g代码如下Q?

#include  
#include
#include
#include
#include
#include
#include
#include
#define SERVPORT 3333 /*服务器监听端口号 */
#define BACKLOG 10 /* 最大同时连接请求数 */
main()
{
int sockfd,client_fd; /*sock_fdQ监听socketQclient_fdQ数据传输socket */
 struct sockaddr_in my_addr; /* 本机地址信息 */
 struct sockaddr_in remote_addr; /* 客户端地址信息 */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
  perror("socket创徏出错Q?); exit(1);
}
my_addr.sin_family=AF_INET;
 my_addr.sin_port=htons(SERVPORT);
 my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
 if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \
   == -1) {
perror("bind出错Q?);
exit(1);
}
 if (listen(sockfd, BACKLOG) == -1) {
perror("listen出错Q?);
exit(1);
}
while(1) {
  sin_size = sizeof(struct sockaddr_in);
  if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, \
  &sin_size)) == -1) {
perror("accept出错");
continue;
}
  printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));
  if (!fork()) { /* 子进E代码段 */
   if (send(client_fd, "Hello, you are connected!\n", 26, 0) == -1)
   perror("send出错Q?);
close(client_fd);
exit(0);
}
  close(client_fd);
  }
 }
}

 

  服务器的工作程是这LQ首先调用socket函数创徏一个SocketQ然后调用bind函数其与本机地址以及一个本地端口号l定Q然后调用listen在相应的socket上监听,当accpet接收C个连接服务请求时Q将生成一个新的socket。服务器昄该客h的IP地址Qƈ通过新的socket向客L发送字W串"HelloQyou are connected!"。最后关闭该socket?/span>

  代码实例中的fork()函数生成一个子q程来处理数据传输部分,fork()语句对于子进E返回的gؓ0。所以包含fork函数的if语句是子q程代码部分Q它与if语句后面的父q程代码部分是ƈ发执行的?

  客户端程序代码如下:

#include 
#include
#include
#include
#include
#include
#include
#include
#define SERVPORT 3333
#define MAXDATASIZE 100 /*每次最大数据传输量 */
main(int argc, char *argv[]){
 int sockfd, recvbytes;
 char buf[MAXDATASIZE];
 struct hostent *host;
 struct sockaddr_in serv_addr;
 if (argc < 2) {
fprintf(stderr,"Please enter the server's hostname!\n");
exit(1);
}
 if((host=gethostbyname(argv[1]))==NULL) {
herror("gethostbyname出错Q?);
exit(1);
}
 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("socket创徏出错Q?);
exit(1);
}
 serv_addr.sin_family=AF_INET;
 serv_addr.sin_port=htons(SERVPORT);
 serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
 bzero(&(serv_addr.sin_zero),8);
 if (connect(sockfd, (struct sockaddr *)&serv_addr, \
   sizeof(struct sockaddr)) == -1) {
perror("connect出错Q?);
exit(1);
}
 if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1) {
perror("recv出错Q?);
exit(1);
}
 buf[recvbytes] = '\0';
 printf("Received: %s",buf);
 close(sockfd);
}
客户端程序首先通过服务器域名获得服务器的IP地址Q然后创Z个socketQ调用connect函数与服务器建立q接Q连接成功之后接收从服务器发送过来的数据Q最后关闭socket?

  函数gethostbyname()是完成域名{换的。由于IP地址难以记忆和读写,所以ؓ了方便,Z常常用域名来表示LQ这需要进行域名和IP地址的{换。函数原型ؓQ?/span>


  struct hostent *gethostbyname(const char *name); 
  函数q回为hosten的结构类型,它的定义如下Q?
  struct hostent {
  char *h_name; /* L的官方域?*/
   char **h_aliases; /* 一个以NULLl尾的主机别名数l?*/
   int h_addrtype; /* q回的地址cdQ在Internet环境下ؓAF-INET */
  int h_length; /* 地址的字节长?*/
   char **h_addr_list; /* 一个以0l尾的数l,包含该主机的所有地址*/
  };
  #define h_addr h_addr_list[0] /*在h-addr-list中的W一个地址*/

 

  ?gethostname()调用成功Ӟq回指向struct hosten的指针,当调用失败时q回-1。当调用gethostbynameӞ你不能用perror()函数来输出错误信息,而应该用herror()函数来输出?

  无连接的客户/服务器程序的在原理上和连接的客户/服务器是一LQ两者的区别在于无连接的客户/服务器中的客户一般不需要徏立连接,而且在发送接收数据时Q需要指定远端机的地址?

  d和非d

  d函数在完成其指定的Q务以前不允许E序调用另一个函数。例如,E序执行一个读数据的函数调用时Q在此函数完成读操作以前不会执行下一E序语句。当服务器运行到accept语句Ӟ而没有客戯接服务请求到来,服务器就会停止在accept语句上等待连接服务请求的到来。这U情늧为阻塞(blockingQ。而非d操作则可以立卛_成。比如,如果你希望服务器仅仅注意查是否有客户在等待连接,有就接受q接Q否则就l箋做其他事情,则可以通过Socket讄为非d方式来实现。非dsocket在没有客户在{待时就使accept调用立即q回?
  #include
  #include
  ……
sockfd = socket(AF_INET,SOCK_STREAM,0);
fcntl(sockfd,F_SETFL,O_NONBLOCK)Q?
……

  通过讄socket为非d方式Q可以实?轮询"若干Socket。当企图从一个没有数据等待处理的非阻塞Socketd数据Ӟ函数立卌回,q回gؓ-1Qƈ|errnogؓEWOULDBLOCK。但是这U?轮询"会CPU处于忙等待方式,从而降低性能Q浪费系l资源。而调用select()会有效地解决q个问题Q它允许你把q程本n挂v来,而同时ɾpȝ内核监听所要求的一l文件描q符的Q何活动,只要认在Q何被监控的文件描q符上出现活动,select()调用返回指C文g描述W已准备好的信息Q从而实CE选出随机的变化,而不必由q程本n对输入进行测试而浪费CPU开销。Select函数原型?
int select(int numfds,fd_set *readfds,fd_set *writefdsQ?
fd_set *exceptfds,struct timeval *timeout);

  其中readfds、writefds、exceptfds分别是被select()监视的读、写和异常处理的文g描述W集合。如果你希望定是否可以从标准输入和某个socket描述W读取数据,你只需要将标准输入的文件描q符0和相应的sockdtfd加入到readfds集合中;numfds的值是需要检查的L最高的文g描述W加1Q这个例子中numfds的值应为sockfd+1Q当selectq回Ӟreadfds被修改Q指C某个文件描q符已经准备被读取,你可以通过FD_ISSSET()来测试。ؓ了实现fd_set中对应的文g描述W的讄、复位和试Q它提供了一l宏Q?
  FD_ZERO(fd_set *set)----清除一个文件描q符集;
  FD_SET(int fd,fd_set *set)----一个文件描q符加入文g描述W集中;
  FD_CLR(int fd,fd_set *set)----一个文件描q符从文件描q符集中清除Q?
  FD_ISSET(int fd,fd_set *set)----试判断是否文件描q符被置位?
  Timeout参数是一个指向struct timevalcd的指针,它可以select()在等待timeout长时间后没有文g描述W准备好卌回。struct timeval数据l构为:
  struct timeval {
   int tv_sec; /* seconds */
   int tv_usec; /* microseconds */ };

  POP3客户端实?

  下面的代码实例基于POP3的客户协议,与邮件服务器q接q取回指定用户帐L邮g。与邮g服务器交互的命o存储在字W串数组POPMessage中,E序通过一个do-while循环依次发送这些命令?

#include 
#include
#include
#include
#include
#include
#include
#include
#define POP3SERVPORT 110
#define MAXDATASIZE 4096

 

main(int argc, char *argv[]){
int sockfd;
struct hostent *host;
struct sockaddr_in serv_addr;
char *POPMessage[]={
"USER userid\r\n",
"PASS password\r\n",
"STAT\r\n",
"LIST\r\n",
"RETR 1\r\n",
"DELE 1\r\n",
"QUIT\r\n",
NULL
};
int iLength;
int iMsg=0;
int iEnd=0;
char buf[MAXDATASIZE];

if((host=gethostbyname("your.server"))==NULL) {
perror("gethostbyname error");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("socket error");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(POP3SERVPORT);
serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero),8);
if (connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1){
perror("connect error");
exit(1);
}

do {
send(sockfd,POPMessage[iMsg],strlen(POPMessage[iMsg]),0);
printf("have sent: %s",POPMessage[iMsg]);

iLength=recv(sockfd,buf+iEnd,sizeof(buf)-iEnd,0);
iEnd+=iLength;
buf[iEnd]='\0';
printf("received: %s,%d\n",buf,iMsg);

iMsg++;
} while (POPMessage[iMsg]);

close(sockfd);
}



john 2007-07-23 22:45 发表评论
]]> վ֩ģ壺 㽶Ƶ| ˿wwwѸ| ޾ƷѶ| ޳ۺӰԺԺ| պƷһůů| ձ޳ɸһ| ɫƵվ| ɫ6| ž99°| ޾ƷĻþò| ѹۿ˵ŮƵ| ޾ƷҹVAþó | ޹Ʒþþ| þþƷ| ޳AVƬþ| ߹ۿ| ձ߹ۿѸ| ŷ͵ҹɫ| ѿjŽŮjѿ| þþþþAVר| һƵ| ޾ƷѿӰԺ| avƬ߹ۿ18Ů| ˳ɻҳ߹ۿձ| һƬ߹ۿ| avҹƬƷӰ| aëƬѹۿ| ޹ƷҹӰ| ĻӰѹۿ| ҹƷƬѹۿ| ޵һĻ| ѿƬִֻ| eeussӰԺ| avר| ޳һ| 999þþѾƷ | ȫӳѹۿ߿| ޳a˲߹ۿ| ޾ƷƵ߹ۿ㶮| 99þù-99þù| heyzoרۺ|