﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-chlclan</title><link>http://www.cnitblog.com/chlclan/</link><description /><language>zh-cn</language><lastBuildDate>Sat, 02 May 2026 06:33:41 GMT</lastBuildDate><pubDate>Sat, 02 May 2026 06:33:41 GMT</pubDate><ttl>60</ttl><item><title>本来还想用多线程来做的，后来发现有多进程更容易实现，所以就改成多进程了！</title><link>http://www.cnitblog.com/chlclan/archive/2006/08/30/16150.html</link><dc:creator>Enjoy Life</dc:creator><author>Enjoy Life</author><pubDate>Wed, 30 Aug 2006 02:55:00 GMT</pubDate><guid>http://www.cnitblog.com/chlclan/archive/2006/08/30/16150.html</guid><wfw:comment>http://www.cnitblog.com/chlclan/comments/16150.html</wfw:comment><comments>http://www.cnitblog.com/chlclan/archive/2006/08/30/16150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/chlclan/comments/commentRss/16150.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/chlclan/services/trackbacks/16150.html</trackback:ping><description><![CDATA[
		<p>#include "local.h"<br />#include &lt;pthread.h&gt;<br />#include "util.h"<br />#include "debug.h"<br />#define BDBG dbg<br />/*<br />void *<br />func(void *arg){<br />        pid_t pid;<br /> pthread_t tid; <br /> pid = getpid();<br />        tid = pthread_self();<br />        printf("pid is %u\n",(unsigned int)pid);<br />        printf("thread id  is %u\n",(unsigned int)tid);<br /> struct mip6_args *rad_args;<br /> rad_args = (struct mip6_args *)arg;<br /> printf("----msg buff in args is %s\n", rad_args-&gt;buff);<br />        return((void *)0);<br />}<br />*/<br />main(void)<br />{<br /> //about new pthread<br />// pthread_t radius_thread;<br />// pthread_attr_t attrs;<br />// struct mip6_args rad_thread_args;<br />// int err;<br /> <br /> //rad_thread_args.argv[1]="Password = test";<br />// rad_thread_args.argv[0]="User-Name = test";</p>
		<p> <br /> int mid,n;<br /> key_t key;<br /> MESSAGE msg;</p>
		<p>
				<br /> //thread<br />// pthread_attr_init(&amp;attrs);<br /> //pthread_attr_setdetachstate(&amp;attrs, PTHREAD_CREATE_DETACHED);</p>
		<p> //Use the Same key with Client<br /> if((key  = ftok(".", SEED)) == -1){<br />  perror("Client : key generation");<br />  exit(1);<br /> }<br />// mid = msgget(key, IPC_CREAT | 0660);<br /> printf("server mid is %d\n", mid);<br /> while(1){<br />  if((n = msgrcv(65538, &amp;msg, sizeof(msg), SERVER,0)) == -1){<br />   perror("SERVER:msgrcv");<br />   exit(2);<br />  }<br />  else if (n==0)//client have finished<br />   break;<br />  else{<br />   printf("msg type is %d\n", msg.acct_msg.acct_type);<br />   BDBG("msg hoa is= %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&amp;msg.acct_msg.hoa));<br />   BDBG("msg coa is= %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&amp;msg.acct_msg.coa));<br />   //child process to communication to the radius server;<br />   if(fork() == 0){<br />    <br />    argv[1] = "-f";<br />    argv[2] = "/home/chl/radtest/test.conf";<br />    argv[3] = "[3ffe:3240:8007:602::1]:1813";<br />    argv[4] = "acct";<br />    argv[5] = "testing123";<br />    execlp("/home/radclient","radclient",argv[1],argv[2],argv[3],argv[4],argv[5]);<br />   }<br />   //parent process nothing to do <br />   else<br />    ;<br />   <br />//   rad_thread_args.buff = msg.buffer;<br />   //when recv msg from HA, should send acct to server<br />//         err = pthread_create(&amp;radius_thread, &amp;attrs, func,&amp;rad_thread_args);<br />//   if(err != 0){<br />//    perror("thread create:");<br />//    exit(6);<br />//   }<br />   /*<br />   printf("----about main is------\n");<br />   printf("main processid is %d\n",getpid());<br />   printf("main threadid is %d\n",pthread_self());<br />   */<br />  }<br /> }<br /> msgctl(mid, IPC_RMID, (struct msqid_ds *)0);<br /> exit(0);<br />}</p>
<img src ="http://www.cnitblog.com/chlclan/aggbug/16150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/chlclan/" target="_blank">Enjoy Life</a> 2006-08-30 10:55 <a href="http://www.cnitblog.com/chlclan/archive/2006/08/30/16150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架设freeradius mysql 的radius服务器 作者：bell</title><link>http://www.cnitblog.com/chlclan/archive/2006/08/28/16076.html</link><dc:creator>Enjoy Life</dc:creator><author>Enjoy Life</author><pubDate>Mon, 28 Aug 2006 09:05:00 GMT</pubDate><guid>http://www.cnitblog.com/chlclan/archive/2006/08/28/16076.html</guid><wfw:comment>http://www.cnitblog.com/chlclan/comments/16076.html</wfw:comment><comments>http://www.cnitblog.com/chlclan/archive/2006/08/28/16076.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/chlclan/comments/commentRss/16076.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/chlclan/services/trackbacks/16076.html</trackback:ping><description><![CDATA[
		<table class="outer" cellspacing="1">
				<tbody>
						<tr>
								<td class="odd">
										<div class="comTitle">9. FreeRADIUS伺服器安裝</div>
										<div class="comText">
												<span style="FONT-SIZE: medium">
														<br />FreeRADIUS伺服器經過兩天的嘗試與摸索終於可以達成利用file與mysql做認證了，我主要是參考以下資料來建置完成FreeRADIUS伺服器：<br /><br /><a href="http://phorum.study-area.org//viewtopic.php?t=33002&amp;sid=405835706ac1b7ae0012e49490ed8a51" target="_blank"><font color="#804b30">http://phorum.study-area.org//viewtopic.php?t=33002&amp;sid=405835706ac1b7ae0012e49490ed8a51</font></a><br /><br />除了一些小地方需要修改之外，這篇文章的可靠度相當的高。<br /><br />為了預防文章以後淹沒在茫茫網海之中，我就將他轉錄到以下吧，順便將我所實驗的心得一併加入。<br />------------------------------------------------------------------------<br /><br />我是參考下列資料<br /><br />架設freeradius+mysql 的radius服務器<br /><a href="http://www.yesky.com/20030306/1655467.shtml" target="_blank"><font color="#804b30">http://www.yesky.com/20030306/1655467.shtml</font></a><br /><br />想玩無線網路認證值得先看的文件<br /><br /><a href="http://phorum.study-area.org/viewtopic.php?t=31918&amp;highlight=radius" target="_blank"><font color="#804b30">http://phorum.study-area.org/viewtopic.php?t=31918&amp;highlight=radius</font></a><br /><br />及其他網路上利用 google 查到的資料作的說明<br /><br />安裝 FreeRADIUS + Files + MySQL 認證<br /><br />1. 下載 FreeRADIUS<br />wget <a href="ftp://ftp.freeradius.org/pub/radius/freeradius-1.0.4.tar.gz" target="_blank"><font color="#804b30">ftp://ftp.freeradius.org/pub/radius/freeradius-1.0.4.tar.gz</font></a><br /><br />2. 解壓縮<br />tar zxvf freeradius-1.0.4.tar.gz<br /><br />3. 安裝 FreeRADIUS<br />cd freeradius-1.0.4<br />./configure --localstatedir=/var --sysconfdir=/etc<br />make<br />make install<br /><br />註: 有時候會報找不到文件rlm_sql_mysql這個時候只要把庫文件加入系統搜索的目錄裡<br /><br />　　比如：<br /><br />　　cp /usr/local/lib/* /usr/lib<br /><br /><br />4. 建立mysql的數據庫raius的表<br />MySQL root 登入<br />mysql -uroot -p密碼<br /><br />建立 radius 資料庫<br />create database radius;<br /><br />建立 radius 使用者<br /><br /><br /><br />匯入 radius 資料表<br />cd src/modules/rlm_sql/drivers/rlm_sql_mysql<br />mysql -uroot -p密碼 radius &lt; db_mysql.sql<br /><br />建立相關資料<br /><br />加入群組資料<br /><br />　　mysql -uroot -p密碼 radius<br />代碼:<br />insert into radgroupreply (groupname,attribute,op,value) values ('user','Auth-Type',':=','Local');<br />insert into radgroupreply (groupname,attribute,op,value) values ('user','Service-Type',':=','Framed-User');<br />insert into radgroupreply (groupname,attribute,op,value) values ('user','Framed-IP-Address',':=','255.255.255.254');<br />insert into radgroupreply (groupname,attribute,op,value) values ('user','Framed-IP-Netmask',':=','255.255.255.0');<br /><br />加入測試賬號<br />　　<br />代碼:<br />insert into radcheck (username,attribute,op,value) values ('test','User-Password',':=','test');<br /><br />測試賬號加入群組<br />　　<br />代碼:<br />insert into usergroup (username,groupname) values ('test','user');<br /><br />以後新增人員時只要使用下列命令<br />代碼:<br />insert into radcheck (username,attribute,op,value) values ('帳號','User-Password',':=','密碼');<br />insert into usergroup (username,groupname) values ('帳號','user');<br /><br /><br /><br />4. 設定 RADIUS<br />更改freeradius的設置<br />cd /etc/raddb<br />備份原始設定檔<br />代碼:<br />cp /etc/raddb/radiusd.conf /etc/raddb/radiusd.conf-def<br />cp /etc/raddb/clients.conf /etc/raddb/clients.conf-def<br />cp /etc/raddb/sql.conf /etc/raddb/sql.conf-def<br />cp /etc/raddb/eap.conf /etc/raddb/eap.conf-def<br />cp /etc/raddb/users /etc/raddb/users-def<br /><br />更改 radiusd.conf 部份設定 如下列<br />代碼:<br />user = root<br />group = root<br />hostname_lookups = yes<br />allow_core_dumps = no<br />regular_expressions = yes<br />extended_expressions = yes<br />log_stripped_names = yes<br />log_auth = yes<br />log_auth_badpass = yes<br />log_auth_goodpass = yes<br />usercollide = no<br />lower_user = yes<br />lower_pass = no<br />nospace_user = no<br />nospace_pass = no<br /><br />files {<br />usersfile = ${confdir}/users<br />acctusersfile = ${confdir}/acct_users<br />preproxy_usersfile = ${confdir}/preproxy_users<br /><br />compat = no<br />}<br /><br />detail {<br />detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d<br /><br />detailperm = 0600<br />}<br /><br />detail auth_log {<br />detailfile = ${radacctdir}/%{Client-IP-Address}/auth-detail-%Y%m%d<br /><br />detailperm = 0600<br />}<br /><br />detail reply_log {<br />detailfile = ${radacctdir}/%{Client-IP-Address}/reply-detail-%Y%m%d<br /><br />detailperm = 0600<br />}<br /><br /><br /><br /><br /><br />acct_unique {<br />key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port"<br />}<br /><br /><br /><br />attr_filter {<br />attrsfile = ${confdir}/attrs<br />}<br /><br />authorize {<br />preprocess<br /><br />auth_log<br /><br />attr_filter<br /><br />chap<br /><br />mschap<br /><br />suffix<br /><br />eap<br /><br />files<br /><br />sql<br /><br />}<br /><br /><br />authenticate {<br />Auth-Type PAP {<br />pap<br />}<br /><br />Auth-Type CHAP {<br />chap<br />}<br /><br />Auth-Type MS-CHAP {<br />mschap<br />}<br /><br />eap<br />}<br /><br /><br />preacct {<br />preprocess<br /><br />acct_unique<br /><br />suffix<br /><br />files<br />}<br /><br />accounting {<br />detail<br /><br />radutmp<br /><br />sql<br /><br />}<br /><br /><br />session {<br />radutmp<br /><br />sql<br />}<br /><br /><br />post-auth {<br /><br />reply_log<br /><br />sql<br /><br /><br />}<br /><br />在 clients.conf 增加下列設定<br />代碼:<br />client 192.168.1.1 {<br />secret = testing123<br />shortname = test<br />}<br /><br />更改 sql.conf 部份設定如下列<br />代碼:<br />sql {<br /><br />driver = "rlm_sql_mysql"<br /><br />server = "localhost" # MySQL 主機位置<br />login = "radius" # MySQL 帳號<br />password = "radius" # MySQL 密碼<br /><br />radius_db = "radius" # MySQL 資料庫名稱<br /><br />acct_table1 = "radacct"<br />acct_table2 = "radacct"<br /><br />postauth_table = "radpostauth"<br /><br />authcheck_table = "radcheck"<br />authreply_table = "radreply"<br /><br />groupcheck_table = "radgroupcheck"<br />groupreply_table = "radgroupreply"<br /><br />usergroup_table = "usergroup"<br /><br />deletestalesessions = yes<br /><br />sqltrace = yes<br />sqltracefile = ${logdir}/sqltrace.sql<br /><br />num_sql_socks = 5<br /><br />connect_failure_retry_delay = 60<br /><br /><br />sql_user_name = "%{User-Name}"<br />更改 eap.conf 部份設定如下列<br />代碼:<br />eap {<br />第 22 行 原 default_eap_type = md5<br />改為 default_eap_type = peap<br /><br />timer_expire = 60<br /><br />ignore_unknown_eap_types = no<br /><br />cisco_accounting_username_bug = no<br /><br /><br />md5 {<br />}<br /><br />leap {<br />}<br /><br />gtc {<br /><br />auth_type = PAP<br />}<br /><br /># 取消下列幾行的註解<br />tls {<br />private_key_password = whatever<br />private_key_file = ${raddbdir}/certs/cert-srv.pem<br /><br />certificate_file = ${raddbdir}/certs/cert-srv.pem<br /><br />CA_file = ${raddbdir}/certs/demoCA/cacert.pem<br /><br />dh_file = ${raddbdir}/certs/dh<br />random_file = ${raddbdir}/certs/random<br /><br />}<br />peap {<br />default_eap_type = mschapv2<br />}<br /><br />mschapv2 {<br />}<br />}<br /><br />更改 users 如下列<br />在第96行增加<br />代碼:<br />"testf" Auth-Type := Local, User-Password == "testf"<br />Reply-Message = "Hello, %u"<br /><br />註解 第 154 ,155 行<br />#DEFAULT Auth-Type = System<br /># Fall-Through = 1<br /><br />測試 flies 認證<br />radtest testf testf localhost 0 testing123<br /><br />測試 MySQL 認證<br />radtest test test localhost 0 testing123<br /><br />結果如下<br /><br />[<a href="mailto:root@UI-linux"><font color="#804b30">root@UI-linux</font></a> raddb]# radtest testf testf localhost 0 testing123<br />Sending Access-Request of id 188 to 127.0.0.1:1812<br />User-Name = "testf"<br />User-Password = "testf"<br />NAS-IP-Address = UI-linux<br />NAS-Port = 0<br />rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=188, length=34<br />Reply-Message = "Hello, testf"<br />[<a href="mailto:root@UI-linux"><font color="#804b30">root@UI-linux</font></a> raddb]# radtest test test localhost 0 testing123<br />Sending Access-Request of id 192 to 127.0.0.1:1812<br />User-Name = "test"<br />User-Password = "test"<br />NAS-IP-Address = UI-linux<br />NAS-Port = 0<br />rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=192, length=38<br />Service-Type = Framed-User<br />Framed-IP-Address = 255.255.255.254<br />Framed-IP-Netmask = 255.255.255.0<br />[<a href="mailto:root@UI-linux"><font color="#804b30">root@UI-linux</font></a> raddb]#<br /></span>
										</div>
								</td>
						</tr>
						<tr>
								<td class="even">
								</td>
								<td class="even" align="right">
										<a href="http://www.bell.idv.tw/modules/newbb/reply.php?forum=1&amp;post_id=564&amp;topic_id=527&amp;viewmode=flat&amp;order=">
												<img alt="回覆" src="http://www.bell.idv.tw/images/icons/reply.gif" />
										</a>
								</td>
						</tr>
						<!-- end comment post -->
						<!-- start comment post -->
						<tr>
								<td class="head">
										<a id="forumpost565">
										</a>
										<a href="http://www.bell.idv.tw/userinfo.php?uid=1">bell</a>
								</td>
								<td class="head">
										<div class="comDate">
												<span class="comDateCaption">
														<strong>張貼於: </strong>
												</span>2005/9/21 14:56</div>
								</td>
						</tr>
						<tr>
								<td class="odd">
										<div class="comUserRank">
												<div class="comUserRankText">管理員</div>
												<img alt="" src="http://www.bell.idv.tw/uploads/rank3dbf8ee8681cd.gif" />
										</div>
										<img class="comUserImg" alt="" src="http://www.bell.idv.tw/uploads/blank.gif" />
										<div class="comUserStat">
												<span class="comUserStatCaption">註冊日:</span> 2005/8/8</div>
										<div class="comUserStat">
												<span class="comUserStatCaption">來自:</span>
										</div>
										<div class="comUserStat">
												<span class="comUserStatCaption">張貼數:</span> 761</div>
										<div class="comUserStatus">
										</div>
								</td>
								<td class="odd">
										<div class="comTitle">我的心得</div>
										<div class="comText">
												<span style="FONT-SIZE: medium">
														<br />首先，現在最新版的freeradius版本已經進到1.0.5了，是在2005.09.09推出的。<br /><br />而我所使用的linux distro是CentOS 4.1完整安裝，裡面已經內含 freeradius 1.0.1，所以一開始的時候我是以內建的 1.0.1嘗試架設，但在以下這個步驟時卻一直出現錯誤訊息：<br /><br />mysql -uroot -p密碼 radius &lt; db_mysql.sql<br /><br />無法順利匯入到radius資料庫中。反覆查找資料之後發現，問題應該出在mysql版本上，1.0.1所附的 db_mysql.sql 應該是給 mysql 3.x版用的。<br /><br />在我下載了 1.0.4與 1.0.5 tar.gz版本的檔案來安裝時，這個步驟便可以順利的完成而沒有任何錯誤訊息。<br /></span>
										</div>
								</td>
						</tr>
						<tr>
								<td class="even">
								</td>
								<td class="even" align="right">
										<a href="http://www.bell.idv.tw/modules/newbb/reply.php?forum=1&amp;post_id=565&amp;topic_id=527&amp;viewmode=flat&amp;order=">
												<img alt="回覆" src="http://www.bell.idv.tw/images/icons/reply.gif" />
										</a>
								</td>
						</tr>
						<!-- end comment post -->
						<!-- start comment post -->
						<tr>
								<td class="head">
										<a id="forumpost731">
										</a>
										<a href="http://www.bell.idv.tw/userinfo.php?uid=1">bell</a>
								</td>
								<td class="head">
										<div class="comDate">
												<span class="comDateCaption">
														<strong>張貼於: </strong>
												</span>2006/3/14 11:25</div>
								</td>
						</tr>
						<tr>
								<td class="odd">
										<div class="comUserRank">
												<div class="comUserRankText">管理員</div>
												<img alt="" src="http://www.bell.idv.tw/uploads/rank3dbf8ee8681cd.gif" />
										</div>
										<img class="comUserImg" alt="" src="http://www.bell.idv.tw/uploads/blank.gif" />
										<div class="comUserStat">
												<span class="comUserStatCaption">註冊日:</span> 2005/8/8</div>
										<div class="comUserStat">
												<span class="comUserStatCaption">來自:</span>
										</div>
										<div class="comUserStat">
												<span class="comUserStatCaption">張貼數:</span> 761</div>
										<div class="comUserStatus">
										</div>
								</td>
								<td class="odd">
										<div class="comTitle">我的心得 (2006.03.29更新)</div>
										<div class="comText">在2006.03.13時我依照此份文件於CentOS 4.2的機器上重新安裝freeradius server，發現此文章有需要修改之處，所以重新更新此文章內容。<br /><br /><span style="FONT-SIZE: large"><b>一 前言</b></span><br /><br />RADIUS是 Remote Authentication Dial-In User Service 的縮寫，可以執行對用戶的驗證、授權和記費（AAA）。<br /><br />在Unix-Like的作業系統（如linux，bsd...）上最常被使用的radius伺服器軟體是freeradius，這是一套開源碼(open source code)且免費的軟體，所以本文重點就在於如何在linux上架設freeradius伺服器的過程，至於RADIUS本身的運作原理則不在本文討論範圍。<br /><br /><span style="FONT-SIZE: large"><b>二 安裝環境</b></span><br /><br />本文件依照以下環境安裝與執行並進行相關測試：<br /><br />OS : CentOS 4.2 i386(RedHat RHEL 4 clone version)<br />website : <a href="http://www.centos.org/" target="_blank"><font color="#804b30">http://www.centos.org</font></a><br /><br />freeradius : freeradius-1.1.1.tar.gz<br />website : <a href="http://www.freeradius.org/" target="_blank"><font color="#804b30">http://www.freeradius.org</font></a><br /><br />Mysql : mysql-4.1.12-3.RHEL4.1 (2006.03.20釋出)<br /><br />Compiler : GCC-3.4.4-2<br /><br /><span style="FONT-SIZE: large"><b>三 下載與解壓縮軟體</b></span><br /><br />下載freeradius軟體請至 <a href="http://www.freeradius.org/getting.html" target="_blank"><font color="#804b30">http://www.freeradius.org/getting.html</font></a> 載回最新版軟體。<br /><br />下載之軟體建議放至 /usr/local/src下進行編譯，以下的文章皆以 /usr/local/src目錄為安裝目錄。<br /><br />解壓縮軟體請執行<br /><br /><span style="COLOR: #0000ff">tar zxvf freeradius-1.1.1.tar.gz</span><br /><br />解壓縮完畢之後將會產生一個freeradius-1.1.1的目錄，所有解壓縮完的檔案都會放在這個目錄下。<br /><br /><span style="FONT-SIZE: large"><b>四 移除舊軟體</b></span><br /><br />如果你的OS是完整安裝的話，那在開始進行編譯與安裝之前，必須先將OS所附的舊版freeradius移除掉再進行後續的編譯與安裝。<br /><br />以root使用者權限執行以下指令：<br /><br /><span style="COLOR: #0000ff">rpm -e freeradius*</span><br /><br /><span style="FONT-SIZE: large"><b>五 編譯與安裝</b></span><br /><br />以root權限執行以下指令：<br /><br /><span style="COLOR: #0000ff">./configure<br />make<br />make install</span><br /><br />沒錯，這樣就完成了整個程式的編譯與安裝，夠簡單了吧？<br /><br />如果要指定安裝的目錄與設定檔的目錄的話，可以改成：<br /><br /><span style="COLOR: #0000ff">./configure --localstatedir=/var --sysconfdir=/etc <br />make<br />make install</span><br /><br /><span style="FONT-SIZE: large"><b>六 設定mysql資料庫</b></span><br /><br />在進行freeradius的設定與執行之前，我們先將mysql的資料庫與相關設定做好，在資料庫這方面我建議以phpmyadmin來進行相關工作會比較輕鬆。<br /><br />當然，如果你很熟mysql的指令操作的話也可以使用文字模式下的指令來進行。<br /><br />mysql資料庫的安裝可以參考本站這篇文章：<br /><a href="http://www.bell.idv.tw/modules/newbb/viewtopic.php?topic_id=4&amp;forum=1" target="_blank"><font color="#804b30">http://www.bell.idv.tw/modules/newbb/viewtopic.php?topic_id=4&amp;forum=1</font></a><br /><br />phpmyadmin的安裝可以參考本站這篇文章：<br /><a href="http://www.bell.idv.tw/modules/newbb/viewtopic.php?topic_id=53&amp;forum=3" target="_blank"><font color="#804b30">http://www.bell.idv.tw/modules/newbb/viewtopic.php?topic_id=53&amp;forum=3</font></a><br /><br />首先先建立一個新的資料庫，名稱為 radius。<br /><br />然後建立一個資料庫使用者，名稱為 radius，並賦予他使用資料庫radius的權力。<br /><br />匯入 radius 資料表<br /><span style="COLOR: #0000ff"><br />cd /usr/src/freeradius-1.1.1/src/modules/rlm_sql/drivers/rlm_sql_mysql<br />mysql -uroot -p密碼 radius &lt; db_mysql.sql </span><br /><br />完成之後便會在資料庫radius中建立相關資料。<br /><br />在radius資料庫中加入群組資料：<br /><br />先登入資料庫<span style="COLOR: #0000ff">　　mysql -uroot -p密碼 radius</span><br /><br />在mysql提示號之後輸入以下指令<br /><span style="COLOR: #006600"><br />insert into radgroupreply (groupname,attribute,op,value) values ('user','Auth-Type',':=','Local');<br />insert into radgroupreply (groupname,attribute,op,value) values ('user','Service-Type',':=','Framed-User');<br />insert into radgroupreply (groupname,attribute,op,value) values ('user','Framed-IP-Address',':=','255.255.255.254');<br />insert into radgroupreply (groupname,attribute,op,value) values ('user','Framed-IP-Netmask',':=','255.255.255.0');<br /></span><br />加入測試帳號<br />指令<span style="COLOR: #006600"><br />insert into radcheck (username,attribute,op,value) values ('test','User-Password',':=','test');</span><br /><br />群組中加入測試帳號<br />指令<span style="COLOR: #006600"><br />insert into usergroup (username,groupname) values ('test','user');</span><br /><br />以後新增人員時只要使用下列命令<br />指令<span style="COLOR: #006600"><br />insert into radcheck (username,attribute,op,value) values ('帳號','User-Password',':=','密碼');<br />insert into usergroup (username,groupname) values ('帳號','user');</span><br /><br />到此已經完成mysql的準備工作了。<br /><br /><span style="FONT-SIZE: large"><b>七 設定RADIUS</b></span><br /><br />freeradius的設定檔統一放在 /etc/raddb 目錄下，欲進行下列變更之前請先將原始設定檔備份。<br /><br />更改 radiusd.conf 部份設定<br /><br />原始設定：<br /><span style="COLOR: #999900"><br />#user = nobody<br />#group = nobody<br /><br />hostname_lookups = no<br />allow_core_dumps = no<br />regular_expressions = yes<br />extended_expressions = yes<br />log_stripped_names = no<br />log_auth = no<br />log_auth_badpass = yes<br />log_auth_goodpass = yes<br />usercollide = no<br />lower_user = no<br />lower_pass = no<br />nospace_user = no<br />nospace_pass = no </span><br /><br />改成如下：<br /><span style="COLOR: #999900"><br />user = </span><span style="COLOR: #ff0000"><b>root</b></span> 拿掉前面的#號<br /><span style="COLOR: #999900">group = </span><span style="COLOR: #ff0000"><b>root</b></span> 拿掉前面的#號<br /><span style="COLOR: #999900">hostname_lookups = </span><span style="COLOR: #ff0000"><b>yes</b></span><br /><span style="COLOR: #999900">allow_core_dumps = no<br />regular_expressions = yes<br />extended_expressions = yes<br />log_stripped_names = </span><span style="COLOR: #ff0000"><b>yes</b></span><br /><span style="COLOR: #999900">log_auth = </span><span style="COLOR: #ff0000"><b>yes</b></span><br /><span style="COLOR: #999900">log_auth_badpass = yes<br />log_auth_goodpass = yes<br />usercollide = no<br />lower_user = </span><span style="COLOR: #ff0000"><b>yes</b></span><br /><span style="COLOR: #999900">lower_pass = no<br />nospace_user = no<br />nospace_pass = no </span><br /><br />接下來修改以下部份，原始設定如下<br /><span style="COLOR: #999900"><br /># detail auth_log {<br /># detailfile = ${radacctdir}/%{Client-IP-Address}/auth-detail-%Y%m%d<br /><br /># detailperm = 0600<br />#}<br /><br /># detail reply_log {<br /># detailfile = ${radacctdir}/%{Client-IP-Address}/reply-detail-%Y%m%d<br /><br /># detailperm = 0600<br />#}<br /><br /><br />authorize {<br />preprocess<br /><br /># auth_log<br /><br /># attr_filter<br /><br />chap<br /><br />mschap<br /><br />suffix<br /><br />eap<br /><br />files<br /><br /># sql<br /><br />}<br /><br />accounting {<br />detail<br /><br />radutmp<br /><br /># sql<br /><br />}<br /><br /><br />session {<br />radutmp<br /><br /># sql<br />}<br /><br /><br />post-auth {<br /><br /># reply_log<br /><br /># sql</span><br /><br />改成如下<br /><span style="COLOR: #999900"><br />detail auth_log { </span><span style="COLOR: #ff0000">&lt;-拿掉前面的#號</span><span style="COLOR: #999900"><br />detailfile = ${radacctdir}/%{Client-IP-Address}/auth-detail-%Y%m%d </span><span style="COLOR: #ff0000">&lt;-拿掉前面的#號</span><span style="COLOR: #999900"><br /><br />detailperm = 0600 </span><span style="COLOR: #ff0000">&lt;-拿掉前面的#號</span><span style="COLOR: #999900"><br />} </span><span style="COLOR: #ff0000">&lt;-拿掉前面的#號</span><span style="COLOR: #999900"><br /><br />detail reply_log { </span><span style="COLOR: #ff0000">&lt;-拿掉前面的#號</span><span style="COLOR: #999900"><br />detailfile = ${radacctdir}/%{Client-IP-Address}/reply-detail-%Y%m%d<br /><br />detailperm = 0600 </span><span style="COLOR: #ff0000">&lt;-拿掉前面的#號</span><span style="COLOR: #999900"><br />} </span><span style="COLOR: #ff0000">&lt;-拿掉前面的#號</span><span style="COLOR: #999900"><br /><br /><br />authorize {<br />preprocess<br /><br />auth_log </span><span style="COLOR: #ff0000">&lt;-拿掉前面的#號</span><span style="COLOR: #999900"><br /><br />attr_filter </span><span style="COLOR: #ff0000">&lt;-拿掉前面的#號</span><span style="COLOR: #999900"><br /><br />chap<br /><br />mschap<br /><br />suffix<br /><br />eap<br /><br />files<br /><br />sql </span><span style="COLOR: #ff0000">&lt;-拿掉前面的#號</span><span style="COLOR: #999900"><br /><br />}<br /><br />accounting {<br />detail<br /><br />radutmp<br /><br />sql </span><span style="COLOR: #ff0000">&lt;-拿掉前面的#號</span><span style="COLOR: #999900"><br /><br />}<br /><br /><br />session {<br />radutmp<br /><br />sql </span><span style="COLOR: #ff0000">&lt;-拿掉前面的#號</span><span style="COLOR: #999900"><br />}<br /><br /><br />post-auth {<br /><br />reply_log </span><span style="COLOR: #ff0000">&lt;-拿掉前面的#號</span><span style="COLOR: #999900"><br /><br />sql </span><span style="COLOR: #ff0000">&lt;-拿掉前面的#號</span><span style="COLOR: #999900"><br />}</span><br /><br />到這邊就完成了radiusd.conf的設定，接下來要修改的是 clients.conf 檔。<br /><br />在檔案的最後面新增以下內容：<br /><span style="COLOR: #999900"><br />client 192.168.1.1 {<br />secret = testing123<br />shortname = test<br />}</span><br /><br /><span style="COLOR: #ff0000"><b>注意！此處的ip address請依照自己的區域網路內容設定，不可照抄，以我自己的設定來說，我就將client 192.168.1.1修改為 10.0.0.xx，因為我的區網使用的private ip segment就是10.0.0.0。</b></span><br /><br />再來修改 sql.conf 的內容<br /><span style="COLOR: #999900"><br />sql {<br /><br />driver = "rlm_sql_mysql"<br /><br />server = "localhost" </span>MySQL 主機位置<span style="COLOR: #999900"><br />login = "radius" </span>MySQL 帳號<span style="COLOR: #999900"><br />password = "radius" </span>MySQL 密碼<span style="COLOR: #999900"><br />radius_db = "radius" </span>MySQL 資料庫名稱<br /><br />還記得在第六項時所作的mysql資料庫相關設定嗎？這裡的設定必須與第六項中的設定一致才行，如果你並不是依照範例設定，那記得在這邊要將內容設成與你的資料庫及使用者名稱還有密碼相符。<br /><span style="COLOR: #999900"><br />sqltrace = no </span>&lt;-請改成<span style="COLOR: #ff0000"><b>yes</b></span><br /><br />以上便完成了 sql.conf 檔案的修改，接下來修改 eap.conf 檔案。<br /><span style="COLOR: #999900"><br />eap {<br />default_eap_type = md5</span><br />改為<br /><span style="COLOR: #999900">default_eap_type = </span><span style="COLOR: #ff0000"><b>peap</b></span><br /><br />拿掉下列幾行的註解符號 #<br /><span style="COLOR: #999900">tls {<br />private_key_password = whatever<br />private_key_file = ${raddbdir}/certs/cert-srv.pem<br /><br />certificate_file = ${raddbdir}/certs/cert-srv.pem<br /><br />CA_file = ${raddbdir}/certs/demoCA/cacert.pem<br /><br />dh_file = ${raddbdir}/certs/dh<br />random_file = ${raddbdir}/certs/random<br /><br />}<br /><br />peap {<br />default_eap_type = mschapv2<br />} <br /></span><br />以上便完成了 eap.conf 檔案的修改，接下來修改 users 這個檔案。<br /><br />找到這一段<br /><span style="COLOR: #999900">#"John Doe" Auth-Type := Local, User-Password == "hello"<br /># Reply-Message = "Hello, %u"</span><br /><br />在他的後面加入<br /><span style="COLOR: #999900">"testf" Auth-Type := Local, User-Password == "testf"<br />Reply-Message = "Hello, %u" </span><br /><br />目的在於新增一個名稱為testf密碼為testf的使用者。<br /><br />然後在以下兩行前面加入註解符號 #<br /><br /><span style="COLOR: #999900">DEFAULT Auth-Type = System<br />Fall-Through = 1</span><br /><br />變成如下這樣<br /><br /><span style="COLOR: #999900">#DEFAULT Auth-Type = System<br /># Fall-Through = 1</span><br /><br />進行到這裡，已經完成了所有相關設定檔案的修改。<br /><br /><span style="FONT-SIZE: large"><b>八 執行freeradius</b></span><br /><br />freeradius的主程式有兩種執行模式，一種是正常執行，只要以root權限輸入指令<br /><br /><span style="COLOR: #0000ff">radiusd</span><br /><br />便可以正常執行freeradius程式，執行畫面如下<br /><br />[<a href="mailto:root@bell"><font color="#804b30">root@bell</font></a> raddb]# radiusd<br />Tue Mar 14 15:53:41 2006 : Info: Starting - reading configuration files ...<br /><br />要知道是否有正常執行起來可以用以下指令查詢<br /><br /><span style="COLOR: #0000ff">ps -A | grep radiusd</span><br /><br />會看到類似以下的畫面就是成功了，表示程式已經常駐在記憶體中執行<br /><br />[<a href="mailto:root@bell"><font color="#804b30">root@bell</font></a> raddb]# ps -A | grep radiusd<br />18197 ? 00:00:00 radiusd<br /><br />前面的數字18197是PID(program ID)，每台機器得到的結果並不會一樣，請不必在意，重點在後面。<br /><br />另一種執行方式是除錯模式，請執行以下指令<br /><span style="COLOR: #999900"><br />[<a href="mailto:root@bell"><font color="#804b30">root@bell</font></a> raddb]# radiusd -x</span><br /><br />這時螢幕上會出現如下般的訊息畫面<br /><br />Starting - reading configuration files ...<br />Using deprecated naslist file. Support for this will go away soon.<br />Module: Loaded exec<br />rlm_exec: Wait=yes but no output defined. Did you mean output=none?<br />Module: Instantiated exec (exec)<br />Module: Loaded expr<br />Module: Instantiated expr (expr)<br />Module: Loaded PAP<br />Module: Instantiated pap (pap)<br />Module: Loaded CHAP<br />.<br />.<br />.<br />[中間多餘的訊息節略]<br />Ready to process requests.<br /><br />這表示radiusd進入除錯模式(debug mode)，client端的任何存取都會將相關訊息顯示在螢幕上，以方便管理者進行除錯。<br /><br />如果程式能正常執行，那就可以進行下一步了。<br /><br /><span style="FONT-SIZE: large"><b>九 測試</b></span><br /><br />首先先測試 flies 認證，請執行以下指令<span style="COLOR: #0000ff"><br /><br />radtest testf testf localhost 0 testing123</span><br /><br />如看到以下顯示就表示 files 認證正常<br /><br />Sending Access-Request of id 206 to 127.0.0.1 port 1812<br />User-Name = "testf"<br />User-Password = "testf"<br />NAS-IP-Address = 255.255.255.255<br />NAS-Port = 0<br />rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=206, length=34<br />Reply-Message = "Hello, testf"<br /><br />這裡看到的 Reply-Message 就是你設定在 users 設定檔裡的內容，如果你改變了相關內容這裡顯示的部份也會跟著改變。而 testf testf 就是你設定在 users 設定檔裡的帳號與密碼。<br /><br />不過要記得，每次變更完 users 檔案內容後，都必須重新開啟 radiusd 以使程式載入新的設定內容。<br /><br />再來測試 MySQL 認證，執行以下指令<span style="COLOR: #0000ff"><br /><br />radtest test test localhost 0 testing123</span><br /><br />如看到以下顯示就表示 mysql 認證正常<br /><br />[<a href="mailto:root@bell"><font color="#804b30">root@bell</font></a> raddb]# radtest test test localhost 0 testing123<br />Sending Access-Request of id 192 to 127.0.0.1 port 1812<br />User-Name = "test"<br />User-Password = "test"<br />NAS-IP-Address = 255.255.255.255<br />NAS-Port = 0<br />rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=192, length=38<br />Service-Type = Framed-User<br />Framed-IP-Address = 255.255.255.254<br />Framed-IP-Netmask = 255.255.255.0<br /><br />進行到這裡都能正常的話就表示你的 freeradius 伺服器已經可以利用 files 與 mysql 資料庫來進行認證了。<br /><br /><span style="COLOR: #ff0000"><b>注意！在測試完畢之後請記得將 users 檔案中與 mysql的radius資料庫中將測試帳號刪除掉，以免造成系統漏洞，使不懷好意的使用者得以鑽過認證對系統產生危害。</b></span><br /><br /><span style="FONT-SIZE: large"><b>十 結語</b></span><br /><br />freeradius伺服器能接受的認證方式很多，這裡僅舉了 files 與 mysql 的認證方式，至於其他如LDAP，PAM....等認證方式等以後有機會時再介紹。<br /><br /><span style="FONT-SIZE: large"><b>十一 附錄</b></span><br /><br />本文參考以下相關資料寫成<br />來自酷！學園討論區<br /><a href="http://phorum.study-area.org//viewtopic.php?t=33002&amp;sid=405835706ac1b7ae0012e49490ed8a51" target="_blank"><font color="#804b30">http://phorum.study-area.org//viewtopic.php?t=33002&amp;sid=405835706ac1b7ae0012e49490ed8a51</font></a><br />來自IBM網站<br /><a href="http://www-128.ibm.com/developerworks/tw/library/l-radius/" target="_blank"><font color="#804b30">http://www-128.ibm.com/developerworks/tw/library/l-radius/</font></a><br />來自中國天極網<br /><a href="http://www.yesky.com/20030306/1655467.shtml" target="_blank"><font color="#804b30">http://www.yesky.com/20030306/1655467.shtml</font></a><br /><br />本文中以<span style="COLOR: #0000ff">藍色字體</span>標示的部份表示是linux系統下藥執行的指令。<br />以<span style="COLOR: #006600">草綠色字體</span>標示的部份則是mysql 提示符號下執行的指令。<br />以<span style="COLOR: #999900">黃色字體</span>標示的部份則為設定檔中的內容。<br />以<span style="COLOR: #ff0000">紅色字體</span>標示的部份則是要修改的地方或是警語。<br /><br /><span style="FONT-SIZE: large"><b>十二 相關設定檔範例下載</b></span><br /><br />在這裡我將已經按照上述文章修改過的設定檔提供有需要的人下載，下載之後有兩個檔案需視環境稍做修改，一個是clients.conf，client ip請依照你的環境去設。另一個是sql.conf，其中關於資料庫帳密等地方需依照你的環境做修改。<br /><br />radiusd.conf範例下載：<br /><br /><a href="http://www.bell.idv.tw/bell/doc/linux/conf/freeradius/radiusd.conf" target="_blank"><font color="#804b30">http://www.bell.idv.tw/bell/doc/linux/conf/freeradius/radiusd.conf</font></a><br /><br />clients.conf範例下載：<br /><br /><a href="http://www.bell.idv.tw/bell/doc/linux/conf/freeradius/clients.conf" target="_blank"><font color="#804b30">http://www.bell.idv.tw/bell/doc/linux/conf/freeradius/clients.conf</font></a><br /><br />sql.conf範例下載：<br /><br /><a href="http://www.bell.idv.tw/bell/doc/linux/conf/freeradius/sql.conf" target="_blank"><font color="#804b30">http://www.bell.idv.tw/bell/doc/linux/conf/freeradius/sql.conf</font></a><br /><br />eap.conf範例下載：<br /><br /><a href="http://www.bell.idv.tw/bell/doc/linux/conf/freeradius/eap.conf" target="_blank"><font color="#804b30">http://www.bell.idv.tw/bell/doc/linux/conf/freeradius/eap.conf</font></a><br /><br />users範例下載：<br /><br /><a href="http://www.bell.idv.tw/bell/doc/linux/conf/freeradius/users" target="_blank"><font color="#804b30">http://www.bell.idv.tw/bell/doc/linux/conf/freeradius/users</font></a><br /><br /><br />文章日期：2006.03.14<br />文章作者：Bell</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cnitblog.com/chlclan/aggbug/16076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/chlclan/" target="_blank">Enjoy Life</a> 2006-08-28 17:05 <a href="http://www.cnitblog.com/chlclan/archive/2006/08/28/16076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>0825 代码修改记录</title><link>http://www.cnitblog.com/chlclan/archive/2006/08/25/15922.html</link><dc:creator>Enjoy Life</dc:creator><author>Enjoy Life</author><pubDate>Fri, 25 Aug 2006 01:56:00 GMT</pubDate><guid>http://www.cnitblog.com/chlclan/archive/2006/08/25/15922.html</guid><wfw:comment>http://www.cnitblog.com/chlclan/comments/15922.html</wfw:comment><comments>http://www.cnitblog.com/chlclan/archive/2006/08/25/15922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/chlclan/comments/commentRss/15922.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/chlclan/services/trackbacks/15922.html</trackback:ping><description><![CDATA[
		<p>ha.c<br />在ha.c的顶部增加一个新的全局变量，用来放mssage id,可以被其他函数调用int msg_id;<br />int mip6_ha_main(void)函数内部加入：<br /><br /> /*CaoHongLiang for radiusclient communication,message queue*/<br /> ha_radclient_init(); //初始化一个新的消息队列，用来发送数据到radiusclient。<br /><br />具体实现，就是创建了一个新的消息队列，<br /><br />/*Added By CaoHongLiang*/<br />ha_radclient_init()<br />{<br /> key_t key;<br /> pid_t cli_pid;<br /> <br /> </p>
		<p> cli_pid = getpid();<br /> if((key = ftok(".", SEED)) == -1){<br />  perror("ha_radclient_init: key generation");<br />  exit(1);<br /> }</p>
		<p> /*Creat Message queue*/<br /> if((msg_id = msgget(key, 0)) == -1){<br />  msg_id = msgget(key, IPC_CREAT|0660);<br />  printf("we have a new message queue,it's msg mid is %d\n", mid);<br /> }<br />}<br /></p>
<img src ="http://www.cnitblog.com/chlclan/aggbug/15922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/chlclan/" target="_blank">Enjoy Life</a> 2006-08-25 09:56 <a href="http://www.cnitblog.com/chlclan/archive/2006/08/25/15922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天的具体进展0824</title><link>http://www.cnitblog.com/chlclan/archive/2006/08/24/15877.html</link><dc:creator>Enjoy Life</dc:creator><author>Enjoy Life</author><pubDate>Thu, 24 Aug 2006 07:02:00 GMT</pubDate><guid>http://www.cnitblog.com/chlclan/archive/2006/08/24/15877.html</guid><wfw:comment>http://www.cnitblog.com/chlclan/comments/15877.html</wfw:comment><comments>http://www.cnitblog.com/chlclan/archive/2006/08/24/15877.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/chlclan/comments/commentRss/15877.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/chlclan/services/trackbacks/15877.html</trackback:ping><description><![CDATA[
		<p>这两天一直有个问题困扰着，就是由radclient发送的认证和计费包之后，server端都由于段错误（rad_mangle函数）跳出来，后来发现由rad_authorize函数传入的参数到rad_mangle后，内存就跑飞了，后来再rad_mangle函数中加了一个中间指针，来并重新编译了下，发现认证能够正常执行，可是后来发现计费又没法正常，而且错误完全一样，由此发现这个问题的一部分解决并不是由于刚才代码的修改，后来回想发现自己在编译的时候，重新进入了modules/preprocess中去编译和install了，从而发现问题可能出在这，后来将由影响的几个模块都编译进去，但是最后又发现rlm_krb5，又出错，是代码本身的问题。之后将freeradius-1.1.1中的同一个目录中的modulescopy进来之后，就正常的运行了。从而顺利解决了困扰两天的问题，下一步的工作将是将前两天的做的进程间的通信test代码融入到ha中，从而让ha能够正常将一些信息传送到client中并进一步封装。<br /><br /><br />编译步骤：<br />cd freeradius-0.7.1/<br />./configure<br />make<br />make install<br /><br />然后进入<br />cd src/modules<br />每个模块都进行三步<br />./confiugre<br />make<br />make install<br /><br />cd src/main<br />./configure<br />make<br />make install<br /><br />最后到<br />cd freeradius-0.7.1<br />重新<br />make <br />make install<br />就好了！<br /><br />这样server端能够正常接收从ipv6客户端发来的认证、计费请求<br />并能够回复接收！<br /><br /></p>
<img src ="http://www.cnitblog.com/chlclan/aggbug/15877.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/chlclan/" target="_blank">Enjoy Life</a> 2006-08-24 15:02 <a href="http://www.cnitblog.com/chlclan/archive/2006/08/24/15877.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天工作总结</title><link>http://www.cnitblog.com/chlclan/archive/2006/08/22/15737.html</link><dc:creator>Enjoy Life</dc:creator><author>Enjoy Life</author><pubDate>Tue, 22 Aug 2006 09:46:00 GMT</pubDate><guid>http://www.cnitblog.com/chlclan/archive/2006/08/22/15737.html</guid><wfw:comment>http://www.cnitblog.com/chlclan/comments/15737.html</wfw:comment><comments>http://www.cnitblog.com/chlclan/archive/2006/08/22/15737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/chlclan/comments/commentRss/15737.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/chlclan/services/trackbacks/15737.html</trackback:ping><description><![CDATA[今天主要完成对进程间通信方式的选择和测试，以及对线程的测试：<br />       首先对比了几种进程间的通信方式以及HA与radiusclient间数据传送的实际考虑，同时也考虑了难易程度，最后决定选择消息队列，<br />   消息队列的实现比较简单，一般来说有个client和server，其中client是消息队列的产生者，实际中也就是移动IPv6中的HA，还有一个是接收该消息的sever，实际环境中应该是radiusclient<br /><br />首先:client创建一个新的消息队列，msgget(key_t key,int msgflag);<br />其中key由ftok产生，同时注意server端用的key应该与这个key一样，才能正常的打开client创建好的消息队列并接收消息。今天测试了下程序，能够正常接收client的消息，并在接收到消息之后，能够正常创建一个新的线程来处理这个消息。<br /><br /><br />对于实际情况，想法是这样的，<br />首先对HA扩展<br />当mn移动到一个外地网络时<br />应该发送一个消息到radiusclient去，同时clientserver发送计费信息包到server。。。。。<br /><img src ="http://www.cnitblog.com/chlclan/aggbug/15737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/chlclan/" target="_blank">Enjoy Life</a> 2006-08-22 17:46 <a href="http://www.cnitblog.com/chlclan/archive/2006/08/22/15737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对消息队列的修改，加入线程的处理！</title><link>http://www.cnitblog.com/chlclan/archive/2006/08/22/15735.html</link><dc:creator>Enjoy Life</dc:creator><author>Enjoy Life</author><pubDate>Tue, 22 Aug 2006 09:23:00 GMT</pubDate><guid>http://www.cnitblog.com/chlclan/archive/2006/08/22/15735.html</guid><wfw:comment>http://www.cnitblog.com/chlclan/comments/15735.html</wfw:comment><comments>http://www.cnitblog.com/chlclan/archive/2006/08/22/15735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/chlclan/comments/commentRss/15735.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/chlclan/services/trackbacks/15735.html</trackback:ping><description><![CDATA[
		<p>该client主要是通过消息队列发送消息到server端<br />而server端则监听client的消息队列发送来的消息<br />在每次收到一个新的消息，都创建一个新的线程<br />该线程将主要用于将来吧client发过来的ha的消息来组合形成<br />acct request的消息发送到server端去。<br /><br />client.c<br />同前面一篇blog中记载<br />server.c<br />#include "local.h"<br />#include &lt;pthread.h&gt;<br />void *<br />func(void *arg){<br />        pid_t pid;<br /> pthread_t tid; <br /> pid = getpid();<br />        tid = pthread_self();<br />        printf("pid is %u\n",(unsigned int)pid);<br />        printf("thread id  is %u\n",(unsigned int)tid);<br /> struct mip6_args *rad_args;<br /> rad_args = (struct mip6_args *)arg;<br /> printf("----msg buff in args is %s\n", rad_args-&gt;buff);<br />        return((void *)0);<br />}</p>
		<p>main(void)<br />{<br /> //about new pthread<br /> pthread_t radius_thread;<br /> pthread_attr_t attrs;<br /> struct mip6_args rad_thread_args;<br /> int err;<br /> <br /> //rad_thread_args.argv[1]="Password = test";<br />// rad_thread_args.argv[0]="User-Name = test";</p>
		<p> <br /> int mid,n;<br /> key_t key;<br /> MESSAGE msg;</p>
		<p>
				<br /> //thread<br /> pthread_attr_init(&amp;attrs);<br /> //pthread_attr_setdetachstate(&amp;attrs, PTHREAD_CREATE_DETACHED);</p>
		<p> //Use the Same key with Client<br /> if((key  = ftok(".", SEED)) == -1){<br />  perror("Client : key generation");<br />  exit(1);<br /> }<br /> mid = msgget(key, IPC_CREAT | 0660);<br /> while(1){<br />  if((n = msgrcv(mid, &amp;msg, sizeof(msg), SERVER,0)) == -1){<br />   perror("SERVER:msgrcv");<br />   exit(2);<br />  }<br />  else if (n==0)//client have finished<br />   break;<br />  else{<br />   write(fileno(stdout),msg.buffer, strlen(msg.buffer));<br />   rad_thread_args.buff = msg.buffer;<br />   //when recv msg from HA, should send acct to server<br />         err = pthread_create(&amp;radius_thread, &amp;attrs, func,&amp;rad_thread_args);<br />   if(err != 0){<br />    perror("thread create:");<br />    exit(6);<br />   }<br />   /*<br />   printf("----about main is------\n");<br />   printf("main processid is %d\n",getpid());<br />   printf("main threadid is %d\n",pthread_self());<br />   */<br />  }<br /> }<br /> msgctl(mid, IPC_RMID, (struct msqid_ds *)0);<br /> exit(0);<br />}</p>
		<p> </p>
<img src ="http://www.cnitblog.com/chlclan/aggbug/15735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/chlclan/" target="_blank">Enjoy Life</a> 2006-08-22 17:23 <a href="http://www.cnitblog.com/chlclan/archive/2006/08/22/15735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己写的一个关于消息队列的例子</title><link>http://www.cnitblog.com/chlclan/archive/2006/08/22/15689.html</link><dc:creator>Enjoy Life</dc:creator><author>Enjoy Life</author><pubDate>Tue, 22 Aug 2006 01:25:00 GMT</pubDate><guid>http://www.cnitblog.com/chlclan/archive/2006/08/22/15689.html</guid><wfw:comment>http://www.cnitblog.com/chlclan/comments/15689.html</wfw:comment><comments>http://www.cnitblog.com/chlclan/archive/2006/08/22/15689.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/chlclan/comments/commentRss/15689.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/chlclan/services/trackbacks/15689.html</trackback:ping><description><![CDATA[
		<p>该client和server能达到的基本功能是保证client发出的消息能够从server端接收并在屏幕上显示。要保证server能够接收client的消息，就必须保证server的生成的msg的不标识符是一样的，也就是两个用的key是必须一样的。 这对于我的移动IPv6中的消息传送已经足够了！：）<br /><br />local.h<br />#include &lt;stdio.h&gt;<br />#include &lt;sys/types.h&gt;<br />#include &lt;sys/ipc.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;ctype.h&gt;<br />#include &lt;unistd.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;errno.h&gt;</p>
		<p>#define SEED 'g'<br />#define SERVER 1L<br />#define BUFFERSIZE 1024</p>
		<p>typedef struct {<br /> long msg_to;<br /> long msg_fm;<br /> char buffer[BUFFERSIZE];<br />}MESSAGE;<br /><br /><br />client.c<br />#include "local.h"<br />main(void)<br />{<br /> key_t key;<br /> pid_t  cli_pid;<br /> int  mid, n;<br /> MESSAGE msg;<br /> static char m_key[10];<br /> cli_pid = getpid();</p>
		<p> if((key = ftok(".",SEED)) == -1){<br />  perror("Client:key generation");<br />  exit(1);<br /> }<br /> <br /> /*Create Messg queue*/<br /> if((mid = msgget(key, 0)) == -1){<br />  mid = msgget(key, IPC_CREAT| 0660);<br />  switch(fork()){<br />   case -1:<br />    perror("Client:fork");<br />    exit(3);<br />   case 0:  //child process Added program later<br />    ;<br />    break; <br />  }<br /> }<br /> //parent process <br /> while(1){<br />  msg.msg_to =SERVER;//long int ,value is 1<br />  msg.msg_fm = cli_pid;<br />  write(fileno(stdout), "cmd&gt;",4); <br />  memset(msg.buffer, 0x0, BUFFERSIZE);<br />  n = read(fileno(stdin), msg.buffer, BUFFERSIZE);<br />  if(n == 0)<br />   break;<br />  if(msgsnd(mid, &amp;msg, sizeof(msg), 0) == -1){<br />   perror("Client: msgsend");<br />   exit(5);<br />  }<br /> }<br /> <br /> //delete msg queue<br /> msgsnd(mid, &amp;msg, 0, 0);<br /> exit(0);<br /> <br />}<br /><br />server.c<br />#include "local.h"</p>
		<p>main(void)<br />{<br /> int mid,n;<br /> key_t key;<br /> MESSAGE msg;</p>
		<p> //Use the Same key with Client<br /> if((key  = ftok(".", SEED)) == -1){<br />  perror("Client : key generation");<br />  exit(1);<br /> }<br /> mid = msgget(key, IPC_CREAT | 0660);<br /> while(1){<br />  if((n = msgrcv(mid, &amp;msg, sizeof(msg), SERVER,0)) == -1){<br />   perror("SERVER:msgrcv");<br />   exit(2);<br />  }<br />  else if (n==0)//client have finished<br />   break;<br />  else{<br />   write(fileno(stdout),msg.buffer, strlen(msg.buffer));<br />  }<br /> }<br /> msgctl(mid, IPC_RMID, (struct msqid_ds *)0);<br /> exit(0);<br />}<br /></p>
<img src ="http://www.cnitblog.com/chlclan/aggbug/15689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/chlclan/" target="_blank">Enjoy Life</a> 2006-08-22 09:25 <a href="http://www.cnitblog.com/chlclan/archive/2006/08/22/15689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下查看路由的方法</title><link>http://www.cnitblog.com/chlclan/archive/2006/08/21/15658.html</link><dc:creator>Enjoy Life</dc:creator><author>Enjoy Life</author><pubDate>Mon, 21 Aug 2006 09:03:00 GMT</pubDate><guid>http://www.cnitblog.com/chlclan/archive/2006/08/21/15658.html</guid><wfw:comment>http://www.cnitblog.com/chlclan/comments/15658.html</wfw:comment><comments>http://www.cnitblog.com/chlclan/archive/2006/08/21/15658.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/chlclan/comments/commentRss/15658.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/chlclan/services/trackbacks/15658.html</trackback:ping><description><![CDATA[ipv4：<br />   ip route ：显示比较快<br />   route    : 显示较慢<br />ipv6<br /> ip -6 route ；较快<br />route --inet6 :较慢<img src ="http://www.cnitblog.com/chlclan/aggbug/15658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/chlclan/" target="_blank">Enjoy Life</a> 2006-08-21 17:03 <a href="http://www.cnitblog.com/chlclan/archive/2006/08/21/15658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>radiusclient-0.3.2 中radacct的用法</title><link>http://www.cnitblog.com/chlclan/archive/2006/08/21/15657.html</link><dc:creator>Enjoy Life</dc:creator><author>Enjoy Life</author><pubDate>Mon, 21 Aug 2006 09:02:00 GMT</pubDate><guid>http://www.cnitblog.com/chlclan/archive/2006/08/21/15657.html</guid><wfw:comment>http://www.cnitblog.com/chlclan/comments/15657.html</wfw:comment><comments>http://www.cnitblog.com/chlclan/archive/2006/08/21/15657.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/chlclan/comments/commentRss/15657.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/chlclan/services/trackbacks/15657.html</trackback:ping><description><![CDATA[经过两天的不断调试，终于利用radacct能够发送出正确的数据包了<br />真是晕啊，看来代码要是写的不够好的话，再出错时不给予足够的输出信息时<br />用起来简直是想自杀，不过唯一的收获是对radiusclient的发送包的流程有个较为明确的流程<br />估计下面对ipv6的扩展能够进展的快些<br /><br /><br />1.radacct<br /><br />首先应该编辑/usr/local/etc/radiusclient/下面的文件servers<br />加入一个新行<br />localhost                testing123<br />其中testing123是与服务器的配置nas密码一致的<br />而radiusclient.conf现在并不需要修改<br /><br /><br />radacct -f /usr/local/etc/radiusclient/radiusclient.conf  然后按enter键<br />User-Name=test<br />Password=test<br />Acct-Status-Type=7<br />Acct-Delay-Time=10 然后按Ctrl+D(即输入EOF)可以看到输出：<br />RADIUS accounting OK<br /><br /><br />在网上找到一个新的radiusclient的一个扩展叫<br />radiusclient-ng-0.5.2<br />里面有一个新的test包叫<br />cd /src/.libs/radiusclient<br />用法呵上面的有点相同<br />./radiusclient -f radiusclient.conf -a User-Name=test Acct-Status-Type = 7 Acct-Delay-Time -p 3434<br />其中-p指的是指定发送端的端口<br /><br /><br />还有一个问题就是一开始发现frearadius &amp; radiusclient中很多执行文件不可以调试，<br />后来才发现这些可执行文件都是shell脚本文件，然后跟踪Makefile文件发现这些shell脚本都是调用<br />freeradius/src/main/或者radiusclient/底下的隐藏文件.libs，这个隐藏文件夹放了所有可执行二进制文件。<br />从而可以调试<img src ="http://www.cnitblog.com/chlclan/aggbug/15657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/chlclan/" target="_blank">Enjoy Life</a> 2006-08-21 17:02 <a href="http://www.cnitblog.com/chlclan/archive/2006/08/21/15657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下获取命令行参数——getopt</title><link>http://www.cnitblog.com/chlclan/archive/2006/08/20/15621.html</link><dc:creator>Enjoy Life</dc:creator><author>Enjoy Life</author><pubDate>Sun, 20 Aug 2006 11:59:00 GMT</pubDate><guid>http://www.cnitblog.com/chlclan/archive/2006/08/20/15621.html</guid><wfw:comment>http://www.cnitblog.com/chlclan/comments/15621.html</wfw:comment><comments>http://www.cnitblog.com/chlclan/archive/2006/08/20/15621.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/chlclan/comments/commentRss/15621.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/chlclan/services/trackbacks/15621.html</trackback:ping><description><![CDATA[getopt<span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US"><font face="Times New Roman">UNIX</font></span><span style="FONT-FAMILY: 宋体">下的命令列程式特别好用，特别是在你有许多参数要加入时。一般来说，你可以透过「</span><span lang="EN-US"><font face="Times New Roman">man 3 getopt</font></span><span style="FONT-FAMILY: 宋体">」来获得其说明。这个函数很好用，也很简单，但网上关于这个函数的中文介绍实在是少之又少，这篇文章就简单讲述一下如何利用</span><span lang="EN-US"><font face="Times New Roman">getopt</font></span><span style="FONT-FAMILY: 宋体">函数来获取参数，希望能给那些被参数读取弄得有一点点烦躁的朋友有一点点帮助。</span><h2 style="TEXT-INDENT: -25.5pt; tab-stops: list 25.5pt"><font size="5"><font color="#000000"><span lang="EN-US"><span><font face="Arial">1、</font></span></span><span style="FONT-FAMILY: 黑体">函数说明</span></font></font></h2><p style="TEXT-INDENT: -21pt; tab-stops: list 42.0pt"><font color="#000000"><span lang="EN-US" style="FONT-FAMILY: Wingdings"><span><font face="Wingdings" size="3">n</font><span style="FONT: 7pt 'Times New Roman'">         </span></span></span><span style="FONT-FAMILY: 宋体"><font size="3">表头文件：</font></span><span lang="EN-US"><font face="Times New Roman" size="3">＃i nclude &lt;unistd.h&gt;</font></span></font></p><p style="TEXT-INDENT: -21pt; tab-stops: list 42.0pt"><font color="#000000"><span lang="EN-US" style="FONT-FAMILY: Wingdings"><span><font face="Wingdings" size="3">n</font><span style="FONT: 7pt 'Times New Roman'">         </span></span></span><span style="FONT-FAMILY: 宋体"><font size="3">函数声明：</font></span><span lang="EN-US"><font face="Times New Roman" size="3">int getopt(int argc, char * const argv[], const char *optstring);</font></span></font></p><p style="TEXT-INDENT: -21pt; tab-stops: list 42.0pt"><font color="#000000"><span lang="EN-US" style="FONT-FAMILY: Wingdings"><span><font face="Wingdings" size="3">n</font><span style="FONT: 7pt 'Times New Roman'">         </span></span></span><span style="FONT-FAMILY: 宋体"><font size="3">函数说明：</font></span><span lang="EN-US"><font face="Times New Roman" size="3">getopt()</font></span><span style="FONT-FAMILY: 宋体"><font size="3">用来分析命令行参数。参数</font></span><span lang="EN-US"><font face="Times New Roman" size="3">argc</font></span><span style="FONT-FAMILY: 宋体"><font size="3">和</font></span><span lang="EN-US"><font face="Times New Roman" size="3">argv</font></span><span style="FONT-FAMILY: 宋体"><font size="3">是由</font></span><span lang="EN-US"><font face="Times New Roman" size="3">main()</font></span><span style="FONT-FAMILY: 宋体"><font size="3">传递的参数个数和内容。参数</font></span><span lang="EN-US"><font face="Times New Roman" size="3">optstring </font></span><span style="FONT-FAMILY: 宋体"><font size="3">则代表欲处理的选项字符串。此函数会返回在</font></span><span lang="EN-US"><font face="Times New Roman" size="3">argv </font></span><span style="FONT-FAMILY: 宋体"><font size="3">中下一个的选项字母，此字母会对应参数</font></span><span lang="EN-US"><font face="Times New Roman" size="3">optstring </font></span><span style="FONT-FAMILY: 宋体"><font size="3">中的字母。如果选项字符串里的字母后接着冒号</font></span><span lang="EN-US"><font face="Times New Roman" size="3">“:”</font></span><span style="FONT-FAMILY: 宋体"><font size="3">，则表示还有相关的参数，全域变量</font></span><span lang="EN-US"><font face="Times New Roman" size="3">optarg </font></span><span style="FONT-FAMILY: 宋体"><font size="3">即会指向此额外参数。如果</font></span><span lang="EN-US"><font face="Times New Roman" size="3">getopt()</font></span><span style="FONT-FAMILY: 宋体"><font size="3">找不到符合的参数则会印出错信息，并将全域变量</font></span><span lang="EN-US"><font face="Times New Roman" size="3">optopt</font></span><span style="FONT-FAMILY: 宋体"><font size="3">设为</font></span><span lang="EN-US"><font face="Times New Roman" size="3">“?”</font></span><font size="3"><span style="FONT-FAMILY: 宋体">字符，如果不希望</span><span lang="EN-US"><font face="Times New Roman">getopt()</font></span></font><span style="FONT-FAMILY: 宋体"><font size="3">印出错信息，则只要将全域变量</font></span><span lang="EN-US"><font face="Times New Roman" size="3">opterr</font></span><span style="FONT-FAMILY: 宋体"><font size="3">设为</font></span><span lang="EN-US"><font face="Times New Roman" size="3">0</font></span><span style="FONT-FAMILY: 宋体"><font size="3">即可。</font></span></font></p><p style="TEXT-INDENT: -21pt; tab-stops: list 42.0pt"><font color="#000000"><span lang="EN-US" style="FONT-FAMILY: Wingdings"><span><font face="Wingdings" size="3">n</font><span style="FONT: 7pt 'Times New Roman'">         </span></span></span><span style="FONT-FAMILY: 宋体"><font size="3">返回值：如果找到符合的参数则返回此参数字母，如果参数不包含在参数</font></span><span lang="EN-US"><font face="Times New Roman" size="3">optstring </font></span><span style="FONT-FAMILY: 宋体"><font size="3">的选项字母则返回</font></span><span lang="EN-US"><font face="Times New Roman" size="3">“?”</font></span><span style="FONT-FAMILY: 宋体"><font size="3">字符，分析结束则返回</font></span><font size="3"><span lang="EN-US"><font face="Times New Roman">-1</font></span><span style="FONT-FAMILY: 宋体">。</span></font></font></p><h2 style="TEXT-INDENT: -25.5pt; tab-stops: list 25.5pt"><font size="5"><font color="#000000"><span lang="EN-US"><span><font face="Arial">2、</font></span></span><span style="FONT-FAMILY: 黑体">例子程序</span></font></font></h2><p><font size="3"><font color="#000000"><span lang="EN-US"><span><font face="Times New Roman">       </font></span></span><span style="FONT-FAMILY: 宋体">下面是一个使用</span><span lang="EN-US"><font face="Times New Roman">getopt</font></span><span style="FONT-FAMILY: 宋体">函数读取参数的例子程序，该程序支持</span><font face="Times New Roman"><span lang="EN-US">–p –s –b –c</span></font><span style="FONT-FAMILY: 宋体">的参数，并将这些参数值读取后进行打印。你可以根据需要将这些代码稍作修改用于自己的程序中。</span></font></font></p><p><span lang="EN-US"><font face="Times New Roman" color="#000000" size="3"></font></span></p><p><span lang="EN-US"><font face="Times New Roman" color="#000000" size="3"></font></span></p><table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e0e0e0; BORDER-LEFT: medium none; WIDTH: 100%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="100%" border="1"><tbody><tr><td style="BORDER-RIGHT: windowtext 1pt solid; BORDER-TOP: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; WIDTH: 100%; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="100%"><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font color="#000000">/*</font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span> </span>*<span>  </span>getopt.c</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span> </span>*<span>  </span>Author: Coonxu</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span> </span>*<span>  </span>email:<span>  </span>coonxu@126.com</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span> </span>*</font><span><font color="#000000">  </font></span></font></span><font color="#000000"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">这是一个使用</span><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">getopt</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">函数读取参数的例子程序，该程序支持</span><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"> -p -s -b -c</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">的参数，</span><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"></span></font></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span> </span>* <span></span></font></font></span><font color="#000000"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">并将这些参数值读取后进行打印。你可以根据需要将这些代码稍作修改用于自己的程序中。</span><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"></span></font></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span> </span>*/</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font color="#000000"></font></span> </p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font color="#000000"></font></span> </p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font color="#000000">＃i nclude &lt;unistd.h&gt;</font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font color="#000000">＃i nclude &lt;stdio.h&gt;</font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font color="#000000"></font></span> </p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font color="#000000">int main(int argc, char **argv)</font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font color="#000000">{</font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>    </span>int ch;</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>    </span>opterr = 0;</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>    </span>while( ( ch = getopt( argc, argv, "s:b:c:p:" ) ) != EOF )</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>    </span>{</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>        </span>switch(ch)</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>        </span>{</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>            </span>case 's':</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>                </span>printf("s opt: %s\n", optarg);</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>                </span>break;</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>            </span>case 'b':</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>                </span>printf("b opt: %s\n", optarg);</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>                </span>break;</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>            </span>case 'c':</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>                </span>printf("c opt: %s\n", optarg);</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>                </span>break;</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>            </span>case 'p':</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>                </span>printf("p opt: %s\n", optarg);</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>                </span>break;</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>            </span>case '?':</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>                </span>printf( "illegal option: %c\n", ch );</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>                </span>break;</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>        </span>}</font><font color="#000000"><span>       </span></font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>    </span>}</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font color="#000000"><font face="Courier New"><span>    </span></font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font face="Courier New"><font color="#000000"><span>    </span>return 0;</font></font></span></p><p><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><font color="#000000">}</font></span></p></td></tr></tbody></table><img src ="http://www.cnitblog.com/chlclan/aggbug/15621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/chlclan/" target="_blank">Enjoy Life</a> 2006-08-20 19:59 <a href="http://www.cnitblog.com/chlclan/archive/2006/08/20/15621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>