青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

興海北路

---男兒仗劍自橫行
<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

統計

  • 隨筆 - 85
  • 文章 - 0
  • 評論 - 17
  • 引用 - 0

常用鏈接

留言簿(6)

隨筆分類

隨筆檔案

收藏夾

全是知識啊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

談談Unicode編碼,簡要解釋UCS、UTF、BMP、BOM等名詞

談談Unicode編碼,簡要解釋UCS、UTF、BMP、BOM等名詞

這是一篇程序員寫給程序員的趣味讀物。所謂趣味是指可以比較輕松地了解一些原來不清楚的概念,增進知識,類似于打RPG游戲的升級。整理這篇文章的動機是兩個問題:

問題一:
使用Windows記事本的“另存為”,可以在GBK、Unicode、Unicode big endian和UTF-8這幾種編碼方式間相互轉換。同樣是txt文件,Windows是怎樣識別編碼方式的呢?

我很早前就發現Unicode、Unicode big endian和UTF-8編碼的txt文件的開頭會多出幾個字節,分別是FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。但這些標記是基于什么標準呢?

問題二:
最近在網上看到一個ConvertUTF.c,實現了UTF-32、UTF-16和UTF-8這三種編碼方式的相互轉換。對于Unicode(UCS2)、GBK、UTF-8這些編碼方式,我原來就了解。但這個程序讓我有些糊涂,想不起來UTF-16和UCS2有什么關系。
查了查相關資料,總算將這些問題弄清楚了,順帶也了解了一些Unicode的細節。寫成一篇文章,送給有過類似疑問的朋友。本文在寫作時盡量做到通俗易懂,但要求讀者知道什么是字節,什么是十六進制。

0、big endian和little endian
big endian和little endian是CPU處理多字節數的不同方式。例如“漢”字的Unicode編碼是6C49。那么寫到文件里時,究竟是將6C寫在前面,還是將49寫在前面?如果將6C寫在前面,就是big endian。還是將49寫在前面,就是little endian。

“endian”這個詞出自《格列佛游記》。小人國的內戰就源于吃雞蛋時是究竟從大頭(Big-Endian)敲開還是從小頭(Little-Endian)敲開,由此曾發生過六次叛亂,其中一個皇帝送了命,另一個丟了王位。

我們一般將endian翻譯成“字節序”,將big endian和little endian稱作“大尾”和“小尾”。

1、字符編碼、內碼,順帶介紹漢字編碼
字符必須編碼后才能被計算機處理。計算機使用的缺省編碼方式就是計算機的內碼。早期的計算機使用7位的ASCII編碼,為了處理漢字,程序員設計了用于簡體中文的GB2312和用于繁體中文的big5。

GB2312(1980年)一共收錄了7445個字符,包括6763個漢字和682個其它符號。漢字區的內碼范圍高字節從B0-F7,低字節從A1-FE,占用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。

GB2312支持的漢字太少。1995年的漢字擴展規范GBK1.0收錄了21886個符號,它分為漢字區和圖形符號區。漢字區包括21003個字符。2000年的GB18030是取代GBK1.0的正式國家標準。該標準收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。現在的PC平臺必須支持GB18030,對嵌入式產品暫不作要求。所以手機、MP3一般只支持GB2312。

從ASCII、GB2312、GBK到GB18030,這些編碼方法是向下兼容的,即同一個字符在這些方案中總是有相同的編碼,后面的標準支持更多的字符。在這些編碼中,英文和中文可以統一地處理。區分中文編碼的方法是高字節的最高位不為0。按照程序員的稱呼,GB2312、GBK到GB18030都屬于雙字節字符集 (DBCS)。

有的中文Windows的缺省內碼還是GBK,可以通過GB18030升級包升級到GB18030。不過GB18030相對GBK增加的字符,普通人是很難用到的,通常我們還是用GBK指代中文Windows內碼。

這里還有一些細節:

GB2312的原文還是區位碼,從區位碼到內碼,需要在高字節和低字節上分別加上A0。

在DBCS中,GB內碼的存儲格式始終是big endian,即高位在前。

GB2312的兩個字節的最高位都是1。但符合這個條件的碼位只有128*128=16384個。所以GBK和GB18030的低字節最高位都可能不是1。不過這不影響DBCS字符流的解析:在讀取DBCS字符流時,只要遇到高位為1的字節,就可以將下兩個字節作為一個雙字節編碼,而不用管低字節的高位是什么。

2、Unicode、UCS和UTF
前面提到從ASCII、GB2312、GBK到GB18030的編碼方法是向下兼容的。而Unicode只與ASCII兼容(更準確地說,是與ISO-8859-1兼容),與GB碼不兼容。例如“漢”字的Unicode編碼是6C49,而GB碼是BABA。

Unicode也是一種字符編碼方法,不過它是由國際組織設計,可以容納全世界所有語言文字的編碼方案。Unicode的學名是"Universal Multiple-Octet Coded Character Set",簡稱為UCS。UCS可以看作是"Unicode Character Set"的縮寫。

根據維基百科全書(http://zh.wikipedia.org/wiki/)的記載:歷史上存在兩個試圖獨立設計Unicode的組織,即國際標準化組織(ISO)和一個軟件制造商的協會(unicode.org)。ISO開發了ISO 10646項目,Unicode協會開發了Unicode項目。

在1991年前后,雙方都認識到世界不需要兩個不兼容的字符集。于是它們開始合并雙方的工作成果,并為創立一個單一編碼表而協同工作。從Unicode2.0開始,Unicode項目采用了與ISO 10646-1相同的字庫和字碼。

目前兩個項目仍都存在,并獨立地公布各自的標準。Unicode協會現在的最新版本是2005年的Unicode 4.1.0。ISO的最新標準是10646-3:2003。

UCS規定了怎么用多個字節表示各種文字。怎樣傳輸這些編碼,是由UTF(UCS Transformation Format)規范規定的,常見的UTF規范包括UTF-8、UTF-7、UTF-16。

IETF的RFC2781和RFC3629以RFC的一貫風格,清晰、明快又不失嚴謹地描述了UTF-16和UTF-8的編碼方法。我總是記不得IETF是Internet Engineering Task Force的縮寫。但IETF負責維護的RFC是Internet上一切規范的基礎。

3、UCS-2、UCS-4、BMP

UCS有兩種格式:UCS-2和UCS-4。顧名思義,UCS-2就是用兩個字節編碼,UCS-4就是用4個字節(實際上只用了31位,最高位必須為0)編碼。下面讓我們做一些簡單的數學游戲:

UCS-2有2^16=65536個碼位,UCS-4有2^31=2147483648個碼位。

UCS-4根據最高位為0的最高字節分成2^7=128個group。每個group再根據次高字節分為256個plane。每個plane根據第3個字節分為256行 (rows),每行包含256個cells。當然同一行的cells只是最后一個字節不同,其余都相同。

group 0的plane 0被稱作Basic Multilingual Plane, 即BMP。或者說UCS-4中,高兩個字節為0的碼位被稱作BMP。

將UCS-4的BMP去掉前面的兩個零字節就得到了UCS-2。在UCS-2的兩個字節前加上兩個零字節,就得到了UCS-4的BMP。而目前的UCS-4規范中還沒有任何字符被分配在BMP之外。

4、UTF編碼

UTF-8就是以8位為單元對UCS進行編碼。從UCS-2到UTF-8的編碼方式如下:

UCS-2編碼(16進制) UTF-8 字節流(二進制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

例如“漢”字的Unicode編碼是6C49。6C49在0800-FFFF之間,所以肯定要用3字節模板了:1110xxxx 10xxxxxx 10xxxxxx。將6C49寫成二進制是:0110 110001 001001, 用這個比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

讀者可以用記事本測試一下我們的編碼是否正確。

UTF-16以16位為單元對UCS進行編碼。對于小于0x10000的UCS碼,UTF-16編碼就等于UCS碼對應的16位無符號整數。對于不小于0x10000的UCS碼,定義了一個算法。不過由于實際使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以認為UTF-16和UCS-2基本相同。但UCS-2只是一個編碼方案,UTF-16卻要用于實際的傳輸,所以就不得不考慮字節序的問題。

5、UTF的字節序和BOM
UTF-8以字節為編碼單元,沒有字節序的問題。UTF-16以兩個字節為編碼單元,在解釋一個UTF-16文本前,首先要弄清楚每個編碼單元的字節序。例如收到一個“奎”的Unicode編碼是594E,“乙”的Unicode編碼是4E59。如果我們收到UTF-16字節流“594E”,那么這是“奎”還是“乙”?

Unicode規范中推薦的標記字節順序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一個有點小聰明的想法:

在UCS編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的編碼是FEFF。而FFFE在UCS中是不存在的字符,所以不應該出現在實際傳輸中。UCS規范建議我們在傳輸字節流前,先傳輸字符"ZERO WIDTH NO-BREAK SPACE"。

這樣如果接收者收到FEFF,就表明這個字節流是Big-Endian的;如果收到FFFE,就表明這個字節流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。

UTF-8不需要BOM來表明字節順序,但可以用BOM來表明編碼方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF(讀者可以用我們前面介紹的編碼方法驗證一下)。所以如果接收者收到以EF BB BF開頭的字節流,就知道這是UTF-8編碼了。

Windows就是使用BOM來標記文本文件的編碼方式的。

6、進一步的參考資料
本文主要參考的資料是 "Short overview of ISO-IEC 10646 and Unicode" (http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html)。

我還找了兩篇看上去不錯的資料,不過因為我開始的疑問都找到了答案,所以就沒有看:

"Understanding Unicode A general introduction to the Unicode Standard" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter04a)
"Character set encoding basics Understanding character set encodings and legacy encodings" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter03)
我寫過UTF-8、UCS-2、GBK相互轉換的軟件包,包括使用Windows API和不使用Windows API的版本。以后有時間的話,我會整理一下放到我的個人主頁上(http://fmddlmyy.home4u.china.com)。

我是想清楚所有問題后才開始寫這篇文章的,原以為一會兒就能寫好。沒想到考慮措辭和查證細節花費了很長時間,竟然從下午1:30寫到9:00。希望有讀者能從中受益。





作者Blog:http://blog.csdn.net/fmddlmyy/
參考資料:http://blog.csdn.net/fmddlmyy/

posted @ 2009-01-12 15:42 隨意門 閱讀(506) | 評論 (1)編輯 收藏
ASC編碼

ASC編碼

目前計算機中用得最廣泛的字符集及其編碼,是由美國國家標準局(ANSI)制定的ASCII碼(American Standard Code for Information Interchange,美國標準信息交換碼),它已被國際標準化組織(ISO)定為國際標準,稱為ISO 646標準。適用于所有拉丁文字字母,ASCII碼有7位碼和8位碼兩種形式。
因為1位二進制數可以表示(21=)2種狀態:0、1;而2位二進制數可以表示(22)=4種狀態:00、01、10、11;依次類推,7位二進制數可以表示(27=)128種狀態,每種狀態都唯一地編為一個7位的二進制碼,對應一個字符(或控制碼),這些碼可以排列成一個十進制序號0~127。所以,7位ASCII碼是用七位二進制數進行編碼的,可以表示128個字符。
第0~32號及第127號(共34個)是控制字符或通訊專用字符,如控制符:LF(換行)、CR(回車)、FF(換頁)、DEL(刪除)、BEL(振鈴)等;通訊專用字符:SOH(文頭)、EOT(文尾)、ACK(確認)等;
第33~126號(共94個)是字符,其中第48~57號為0~9十個阿拉伯數字;65~90號為26個大寫英文字母,97~122號為26個小寫英文字母,其余為一些標點符號、運算符號等。
注意:在計算機的存儲單元中,一個ASCII碼值占一個字節(8個二進制位),其最高位(b7)用作奇偶校驗位。所謂奇偶校驗,是指在代碼傳送過程中用來檢驗是否出現錯誤的一種方法,一般分奇校驗和偶校驗兩種。奇校驗規定:正確的代碼一個字節中1的個數必須是奇數,若非奇數,則在最高位b7添1;偶校驗規定:正確的代碼一個字節中1的個數必須是偶數,若非偶數,則在最高位b7添1。
為了便于查詢,以下列出ASCII碼表:
第128~255號為擴展字符(不常用)

ASCII碼鍵盤ASCII 碼鍵盤ASCII 碼鍵盤ASCII 碼鍵盤
27ESC32SPACE33!34"
35#36$37%38&
39'40(41)42*
43+44'45-46.
47/480491502
513524535546
55756857958:
59;60<61=62>
63?64@65A66B
67C68D69E70F
71G72H73I74J
75K76L77M78N
79O80P81Q82R
83S84T85U86V
87W88X89Y90Z
91[92\93]94^
95_96`97a98b
99c100d101e102f
103g104h105i106j
107k108l109m110n
111o112p113q114r
115s116t117u118v
119w120x121y122z
123{124|125}126~

posted @ 2009-01-12 14:32 隨意門 閱讀(335) | 評論 (0)編輯 收藏
Apache+php+mysql在windows下的安裝與配置圖解(最新版)

先準備好軟件:

Apache官方下載地址:apache_2.0.55-win32-x86-no_ssl.msi更多版本在這里

php官方下載地址:php-5.0.5-Win32.zip更多鏡像下載地址更多版本下載

mysql官方下載地址:mysql-4.1.14-win32.zip更多鏡像下載地址更多版本下載

一、安裝Apache,配置成功一個普通網站服務器

運行下載好的“apache_2.0.55-win32-x86-no_ssl.msi”,出現如下界面:

 

出現Apache HTTP Server 2.0.55的安裝向導界面,點“Next”繼續

 

確認同意軟件安裝使用許可條例,選擇“I accept the terms in the license agreement”,點“Next”繼續

 

將Apache安裝到Windows上的使用須知,請閱讀完畢后,按“Next”繼續

 

設置系統信息,在Network Domain下填入您的域名(比如:goodwaiter.com),在Server Name下填入您的服務器名稱(比如:www.goodwaiter.com,也就是主機名加上域名),在Administrator's Email Address下填入系統管理員的聯系電子郵件地址(比如:yinpeng@xinhuanet.com),上述三條信息僅供參考,其中聯系電子郵件地址會在當系統故障時提供給訪問者,三條信息均可任意填寫,無效的也行。下面有兩個選擇,圖片上選擇的是為系統所有用戶安裝,使用默認的80端口,并作為系統服務自動啟動;另外一個是僅為當前用戶安裝,使用端口8080,手動啟動。一般選擇如圖所示。按“Next”繼續。]

 

選擇安裝類型,Typical為默認安裝,Custom為用戶自定義安裝,我們這里選擇Custom,有更多可選項。按“Next”繼續

 

出現選擇安裝選項界面,如圖所示,左鍵點選“Apache HTTP Server 2.0.55”,選擇“This feature, and all subfeatures, will be installed on local hard drive.”,即“此部分,及下屬子部分內容,全部安裝在本地硬盤上”。點選“Change...”,手動指定安裝目錄。

 

我這里選擇安裝在“D:\”,各位自行選取了,一般建議不要安裝在操作系統所在盤,免得操作系統壞了之后,還原操作把Apache配置文件也清除了。選“OK”繼續。

 

返回剛才的界面,選“Next”繼續。

 

確認安裝選項無誤,如果您認為要再檢查一遍,可以點“Back”一步步返回檢查。點“Install”開始按前面設定的安裝選項安裝。

 

正在安裝界面,請耐心等待,直到出現下面的畫面。

 

安裝向導成功完成,這時右下角狀態欄應該出現了下面的這個綠色圖標,表示Apache服務已經開始運行,按“Finish”結束Apache的軟件安裝

 

我們來熟悉一下這個圖標,很方便的,在圖標上左鍵單擊,出現如下界面,有“Start(啟動)”、“Stop(停止)”、“Restart(重啟動)”三個選項,可以很方便的對安裝的Apache服務器進行上述操作。

 

好了現在我們來測試一下按默認配置運行的網站界面,在IE地址欄打“http://127.0.0.1”,點“轉到”,就可以看到如下頁面,表示Apache服務器已安裝成功。

 

現在開始配置Apache服務器,使它更好的替我們服務,事實上,如果不配置,你的安裝目錄下的Apache2\htdocs文件夾就是網站的默認根目錄,在里面放入文件就可以了。這里我們還是要配置一下,有什么問題或修改,配置始終是要會的,如圖所示,“開始”、“所有程序”、“Apache HTTP Server 2.0.55”、“Configure Apache Server”、“Edit the Apache httpd conf Configuration file”,點擊打開。

 

XP的記事本有了些小變化,很實用的一個功能就是可以看到文件內容的行、列位置,按下圖所示,點“查看”,勾選“狀態欄”,界面右下角就多了個標記,“Ln 78, Col 10”就表示“行 78,列 10”,這樣可以迅速的在文件中定位,方便解說。當然,你也可以通過“編輯”,“查找”輸入關鍵字來快速定位。每次配置文件的改變,保存后,必須在 Apache服務器重啟動后生效,可以用前面講的小圖標方便的控制服務器隨時“重啟動”。

 

現在正式開始配置Apache服務器,“Ln 228”,或者查找關鍵字“DocumentRoot”(也就是網站根目錄),找到如下圖所示地方,然后將""內的地址改成你的網站根目錄,地址格式請照圖上的寫,主要是一般文件地址的“\”在Apache里要改成“/”。

 

“Ln 253”,同樣,你也可以通過查找“

 

“Ln321”,DirectoryIndex(目錄索引,也就是在僅指定目錄的情況下,默認顯示的文件名),可以添加很多,系統會根據從左至右的順序來優先顯示,以單個半角空格隔開,比如有些網站的首頁是index.htm,就在光標那里加上“index.htm ”文件名是任意的,不一定非得“index.html”,比如“test.php”等,都可以。

 

這里有一個選擇配置選項,以前可能要配置,現在好像修正過來了,不用配置了,就是強制所有輸出文件的語言編碼,html文件里有語言標記(,這個就是設定文檔語言為gb2312)的也會強制轉換。如果打開的網頁出現亂碼,請先檢查網頁內有沒有上述 html語言標記,如果沒有,添加上去就能正常顯示了。把“# DefaultLanguage nl”前面的“# ”去掉,把“nl”改成你要強制輸出的語言,中文是“zh-cn”,保存,關閉。

 

好了,簡單的Apache配置就到此結束了,現在利用先前的小圖標重啟動,所有的配置就生效了,你的網站就成了一個網站服務器,如果你加載了防火墻,請打開80或8080端口,或者允許Apache程序訪問網絡,否則別人不能訪問。如果你有公網IP(一般ADSL或電話撥號上網的都是),就可以邀請所有能上網的朋友訪問使用http://你的IP地址(IP地址查詢可訪問http://www.goodwaiter.com,查詢內容內即是)你的網站了;如果你沒有公網IP,也可以把內網IP地址告訴局域網內的其它用戶,讓他們通過http://你的內網IP地址,訪問你的網站。

二、php的安裝、以module方式,將php與apache結合使你的網站服務器支持php服務器腳本程序

將下載的php安裝文件php-5.0.5-Win32.zip右鍵解壓縮。

 

指定解壓縮的位置,我的設定在“D:\php”

 

查看解壓縮后的文件夾內容,找到“php.ini-dist”文件,將其重命名為“php.ini”,打開編輯,找到下面圖中的地方, Ln385,有一個“register_globals = Off”值,這個值是用來打開全局變量的,比如表單送過來的值,如果這個值設為“Off”,就只能用“$_POST['變量名']、$_GET['變量名 ']”等來取得送過來的值,如果設為“On”,就可以直接使用“$變量名”來獲取送過來的值,當然,設為“Off”就比較安全,不會讓人輕易將網頁間傳送的數據截取。這個值是否改成“On”就看自己感覺了,是安全重要還是方便重要?

 

這里還有一個地方要編輯,功能就是使php能夠直接調用其它模塊,比如訪問mysql,如下圖所示,Ln563,選擇要加載的模塊,去掉前面的 “;”,就表示要加載此模塊了,加載的越多,占用的資源也就多一點,不過也多不到哪去,比如我要用mysql,就要把“;extension= php_mysql.dll”前的“;”去掉。所有的模塊文件都放在php解壓縮目錄的“ext”之下,我這里的截圖是把所有能加載的模塊都加載上去了,前面的“;”沒去掉的,是因為“ext”目錄下默認沒有此模塊,加載會提示找不到文件而出錯。這里只是參考,一般不需要加載這么多,需要的加載上就可以了,編輯好后保存,關閉。

 

如果上一步加載了其它模塊,就要指明模塊的位置,否則重啟Apache的時候會提示“找不到指定模塊”的錯誤,這里介紹一種最簡單的方法,直接將php安裝路徑、里面的ext路徑指定到windows系統路徑中——在“我的電腦”上右鍵,“屬性”,選擇“高級”標簽,點選“環境變量”,在“系統變量”下找到“Path”變量,選擇,雙擊或點擊“編輯”,將“;D:\php;D:\php\ext”加到原有值的后面,當然,其中的“D:\php” 是我的安裝目錄,你要將它改為自己的php安裝目錄,如下圖所示,全部確定。系統路徑添加好后要重啟電腦才能生效,可以現在重啟,也可以在所有軟件安裝或配置好后重啟。

 

現在開始將php以module方式與Apache相結合,使php融入Apache,照先前的方法打開Apache的配置文件,Ln 173,找到這里,添加進如圖所示選中的兩行,第一行“LoadModule php5_module D:/php/php5apache2.dll”是指以module方式加載php,第二行“PHPIniDir "D:/php"”是指明php的配置文件php.ini的位置,是當然,其中的“D:/php”要改成你先前選擇的php解壓縮的目錄。

 

還是Apache的配置文件,Ln 757,加入“AddType application/x-httpd-php .php”、“AddType application/x-httpd-php .html”兩行,你也可以加入更多,實質就是添加可以執行php的文件類型,比如你再加上一行“AddType application/x-httpd-php .htm”,則.htm文件也可以執行php程序了,你甚至還可以添加上一行“AddType application/x-httpd-php .txt”,讓普通的文本文件格式也能運行php程序。

 

前面所說的目錄默認索引文件也可以改一下,因為現在加了php,有些文件就直接存為.php了,我們也可以把“index.php”設為默認索引文件,優先順序就自己排了,我的是放在第一位。編輯完成,保存,關閉。

 

現在,php的安裝,與Apache的結合已經全部完成,用屏幕右下角的小圖標重啟Apache,你的Apache服務器就支持了php。

三、mysql的安裝,與php、Apache相結合

打開下載的mysql安裝文件mysql-4.1.14-win32.zip,雙擊解壓縮,運行“setup.exe”,出現如下界面

 

mysql安裝向導啟動,按“Next”繼續

 

選擇安裝類型,有“Typical(默認)”、“Complete(完全)”、“Custom(用戶自定義)”三個選項,我們選擇“Custom”,有更多的選項,也方便熟悉安裝過程

 

在“Developer Components(開發者部分)”上左鍵單擊,選擇“This feature, and all subfeatures, will be installed on local hard drive.”,即“此部分,及下屬子部分內容,全部安裝在本地硬盤上”。在上面的“MySQL Server(mysql服務器)”、“Client Programs(mysql客戶端程序)”、“Documentation(文檔)”也如此操作,以保證安裝所有文件。點選“Change...”,手動指定安裝目錄。

 

填上安裝目錄,我的是“D:\mysql”,也建議不要放在與操作系統同一分區,這樣可以防止系統備份還原的時候,數據被清空。按“OK”繼續。

 

返回剛才的界面,按“Next”繼續。

 

確認一下先前的設置,如果有誤,按“Back”返回重做。按“Install”開始安裝。

 

正在安裝中,請稍候,直到出現下面的界面

 

這里是詢問你是否要注冊一個mysql.com的賬號,或是使用已有的賬號登陸mysql.com,一般不需要了,點選“Skip Sign-Up”,按“Next”略過此步驟。

 

現在軟件安裝完成了,出現上面的界面,這里有一個很好的功能,mysql配置向導,不用向以前一樣,自己手動亂七八糟的配置my.ini了,將 “Configure the Mysql Server now”前面的勾打上,點“Finish”結束軟件的安裝并啟動mysql配置向導。

 

mysql配置向導啟動界面,按“Next”繼續。

 

選擇配置方式,“Detailed Configuration(手動精確配置)”、“Standard Configuration(標準配置)”,我們選擇“Detailed Configuration”,方便熟悉配置過程。

 

選擇服務器類型,“Developer Machine(開發測試類,mysql占用很少資源)”、“Server Machine(服務器類型,mysql占用較多資源)”、“Dedicated MySQL Server Machine(專門的數據庫服務器,mysql占用所有可用資源)”,大家根據自己的類型選擇了,一般選“Server Machine”,不會太少,也不會占滿。

 

選擇mysql數據庫的大致用途,“Multifunctional Database(通用多功能型,好)”、“Transactional Database Only(服務器類型,專注于事務處理,一般)”、“Non-Transactional Database Only(非事務處理型,較簡單,主要做一些監控、記數用,對MyISAM數據類型的支持僅限于non-transactional),隨自己的用途而選擇了,我這里選擇“Transactional Database Only”,按“Next”繼續。

 

對InnoDB Tablespace進行配置,就是為InnoDB 數據庫文件選擇一個存儲空間,如果修改了,要記住位置,重裝的時候要選擇一樣的地方,否則可能會造成數據庫損壞,當然,對數據庫做個備份就沒問題了,這里不詳述。我這里沒有修改,使用用默認位置,直接按“Next”繼續

 

選擇您的網站的一般mysql訪問量,同時連接的數目,“Decision Support(DSS)/OLAP(20個左右)”、“Online Transaction Processing(OLTP)(500個左右)”、“Manual Setting(手動設置,自己輸一個數)”,我這里選“Online Transaction Processing(OLTP)”,自己的服務器,應該夠用了,按“Next”繼續

 

是否啟用TCP/IP連接,設定端口,如果不啟用,就只能在自己的機器上訪問mysql數據庫了,我這里啟用,把前面的勾打上,Port Number:3306,按“Next”繼續

 

這個比較重要,就是對mysql默認數據庫語言編碼進行設置,第一個是西文編碼,第二個是多字節的通用utf8編碼,都不是我們通用的編碼,這里選擇第三個,然后在Character Set那里選擇或填入“gbk”,當然也可以用“gb2312”,區別就是gbk的字庫容量大,包括了gb2312的所有漢字,并且加上了繁體字、和其它亂七八糟的字——使用mysql的時候,在執行數據操作命令之前運行一次“SET NAMES GBK;”(運行一次就行了,GBK可以替換為其它值,視這里的設置而定),就可以正常的使用漢字(或其它文字)了,否則不能正常顯示漢字。按 “Next”繼續。

 

選擇是否將mysql安裝為windows服務,還可以指定Service Name(服務標識名稱),是否將mysql的bin目錄加入到Windows PATH(加入后,就可以直接使用bin下的文件,而不用指出目錄名,比如連接,“mysql.exe -uusername -ppassword;”就可以了,不用指出mysql.exe的完整地址,很方便),我這里全部打上了勾,Service Name不變。按“Next”繼續。

 

這一步詢問是否要修改默認root用戶(超級管理)的密碼(默認為空),“New root password”如果要修改,就在此填入新密碼(如果是重裝,并且之前已經設置了密碼,在這里更改密碼可能會出錯,請留空,并將“Modify Security Settings”前面的勾去掉,安裝配置完成后另行修改密碼),“Confirm(再輸一遍)”內再填一次,防止輸錯。“Enable root access from remote machines(是否允許root用戶在其它的機器上登陸,如果要安全,就不要勾上,如果要方便,就勾上它)”。最后“Create An Anonymous Account(新建一個匿名用戶,匿名用戶可以連接數據庫,不能操作數據,包括查詢)”,一般就不用勾了,設置完畢,按“Next”繼續。

 

確認設置無誤,如果有誤,按“Back”返回檢查。按“Execute”使設置生效。

 

設置完畢,按“Finish”結束mysql的安裝與配置——這里有一個比較常見的錯誤,就是不能“Start service”,一般出現在以前有安裝mysql的服務器上,解決的辦法,先保證以前安裝的mysql服務器徹底卸載掉了;不行的話,檢查是否按上面一步所說,之前的密碼是否有修改,照上面的操作;如果依然不行,將mysql安裝目錄下的data文件夾備份,然后刪除,在安裝完成后,將安裝生成的 data文件夾刪除,備份的data文件夾移回來,再重啟mysql服務就可以了,這種情況下,可能需要將數據庫檢查一下,然后修復一次,防止數據出錯。

與Apache及php相結合,前面已提過,這里再說一下,在php安裝目錄下,找到先前重命名并編輯過的 php.ini,如下圖所示,Ln563,把“;extension=php_mysql.dll”前的“;”去掉,加載mysql模塊。保存,關閉后,重啟apache就可以了。這里也可以選擇其它要加載的模塊,去掉前面的“;”,就表示要加載此模塊了,加載的越多,占用的資源也就多一點,不過也多不到哪去。所有的模塊文件都放在php解壓縮目錄的“ext”之下,我這里的截圖是把所有能加載的模塊都加載上去了,前面的“;”沒去掉的,是因為“ext” 目錄下默認沒有此模塊,加載會提示找不到文件而出錯。這里只是參考,一般不需要加載這么多,需要的加載上就可以了,編輯好后保存,關閉。

 

同樣,加載了模塊后,就要指明模塊的位置,否則重啟Apache的時候會提示“找不到指定模塊”的錯誤,這里介紹一種最簡單的方法,直接將 php安裝路徑、里面的ext路徑指定到windows系統路徑中——在“我的電腦”上右鍵,“屬性”,選擇“高級”標簽,點選“環境變量”,在“系統變量”下找到“Path”變量,選擇,雙擊或點擊“編輯”,將“;D:\php;D:\php\ext”加到原有值的后面,當然,其中的“D:\php”是我的安裝目錄,你要將它改為自己的php安裝目錄,如下圖所示,全部確定。系統路徑添加好后要重啟電腦才能生效,可以現在重啟,也可以在所有軟件安裝或配置好后重啟。

posted @ 2008-11-07 10:24 隨意門 閱讀(159) | 評論 (0)編輯 收藏
LINUX信息命令查看大全

來源: ChinaUnix博客  日期: 2008.07.10 19:47 
LINUX信息命令查看大全
# uname -a               # 查看內核/操作系統/CPU信息
# head -n 1 /etc/issue   # 查看操作系統版本
# cat /proc/cpuinfo      # 查看CPU信息
# hostname               # 查看計算機名
# lspci -tv              # 列出所有PCI設備
# lsusb -tv              # 列出所有USB設備
# lsmod                  # 列出加載的內核模塊
# env                    # 查看環境變量資源
# free -m                # 查看內存使用量和交換區使用量
# df -h                  # 查看各分區使用情況
# du -sh         # 查看指定目錄的大小
# grep MemTotal /proc/meminfo   # 查看內存總量
# grep MemFree /proc/meminfo    # 查看空閑內存量
# uptime                 # 查看系統運行時間、用戶數、負載
# cat /proc/loadavg      # 查看系統負載磁盤和分區
# mount | column -t      # 查看掛接的分區狀態
# fdisk -l               # 查看所有分區
# swapon -s              # 查看所有交換分區
# hdparm -i /dev/hda     # 查看磁盤參數(僅適用于IDE設備)
# dmesg | grep IDE       # 查看啟動時IDE設備檢測狀況網絡
# ifconfig               # 查看所有網絡接口的屬性
# iptables -L            # 查看防火墻設置
# route -n               # 查看路由表
# netstat -lntp          # 查看所有監聽端口
# netstat -antp          # 查看所有已經建立的連接
# netstat -s             # 查看網絡統計信息進程
# ps -ef                 # 查看所有進程
# top                    # 實時顯示進程狀態用戶
# w                      # 查看活動用戶
# id             # 查看指定用戶信息
# last                   # 查看用戶登錄日志
# cut -d: -f1 /etc/passwd   # 查看系統所有用戶
# cut -d: -f1 /etc/group    # 查看系統所有組
# crontab -l             # 查看當前用戶的計劃任務服務
# chkconfig --list       # 列出所有系統服務
# chkconfig --list | grep on    # 列出所有啟動的系統服務程序
# rpm -qa                # 查看所有安裝的軟件包
               
               
               

本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u2/72691/showart_1078320.html

posted @ 2008-11-07 09:36 隨意門 閱讀(153) | 評論 (0)編輯 收藏
轉:g++參數說明

轉:g++參數說明

被轉載作者email(pianopan@beeship.com ).  

[介紹]  
gcc and g++分別是gnu的c & c++編譯器  

gcc/g++在執行編譯工作的時候,總共需要4步  

1.預處理,生成.i的文件  
2.將預處理后的文件不轉換成匯編語言,生成文件.s  
3.有匯編變為目標代碼(機器代碼)生成.o的文件  
4.連接目標代碼,生成可執行程序  


[參數詳解]  

-x language filename   
   設定文件所使用的語言,使后綴名無效,對以后的多個有效.也就是根  
   據約定C語言的后綴名稱是.c的,而C++的后綴名是.C或者.cpp,如果  
   你很個性,決定你的C代碼文件的后綴名是.pig 哈哈,那你就要用這  
   個參數,這個參數對他后面的文件名都起作用,除非到了下一個參數  
   的使用。  
   可以使用的參數嗎有下面的這些  
     `c’, `objective-c’, `c-header’, `c++’, `cpp-output’,   
     `assembler’, and `assembler-with-cpp’.  
   看到英文,應該可以理解的。  
   例子用法:  
   gcc -x c hello.pig  
    
-x none filename  
  關掉上一個選項,也就是讓gcc根據文件名后綴,自動識別文件類型  
  例子用法:  
  gcc -x c hello.pig -x none hello2.c  
    
-c   
  只激活預處理,編譯,和匯編,也就是他只把程序做成obj文件  
  例子用法:  
  gcc -c hello.c  
  他將生成.o的obj文件   

-S  
  只激活預處理和編譯,就是指把文件編譯成為匯編代碼。  
  例子用法  
  gcc -S hello.c  
  他將生成.s的匯編代碼,你可以用文本編輯器察看  

-E  
  只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件里  
  面.  
  例子用法:  
  gcc -E hello.c > pianoapan.txt  
  gcc -E hello.c | more  
  慢慢看吧,一個hello word 也要與處理成800行的代碼  

-o  
  制定目標名稱,缺省的時候,gcc 編譯出來的文件是a.out,很難聽,如果  
  你和我有同感,改掉它,哈哈  
  例子用法  
  gcc -o hello.exe hello.c (哦,windows用習慣了)  
  gcc -o hello.asm -S hello.c  

-pipe  
  使用管道代替編譯中臨時文件,在使用非gnu匯編工具的時候,可能有些問  
  題  
  gcc -pipe -o hello.exe hello.c  

-ansi  
  關閉gnu c中與ansi c不兼容的特性,激活ansi c的專有特性(包括禁止一  
  些asm inline typeof關鍵字,以及UNIX,vax等預處理宏,  

-fno-asm  
  此選項實現ansi選項的功能的一部分,它禁止將asm,inline和typeof用作  
  關鍵字。  
      
-fno-strict-prototype  
  只對g++起作用,使用這個選項,g++將對不帶參數的函數,都認為是沒有顯式  
  的對參數的個數和類型說明,而不是沒有參數.  
  而gcc無論是否使用這個參數,都將對沒有帶參數的函數,認為城沒有顯式說  
  明的類型  
    
-fthis-is-varialble  
  就是向傳統c++看齊,可以使用this當一般變量使用.  
    
-fcond-mismatch  
  允許條件表達式的第二和第三參數類型不匹配,表達式的值將為void類型  
    
-funsigned-char  
-fno-signed-char  
-fsigned-char  
-fno-unsigned-char  
  這四個參數是對char類型進行設置,決定將char類型設置成unsigned char(前  
  兩個參數)或者 signed char(后兩個參數)  
    
-include file  
  包含某個代碼,簡單來說,就是便以某個文件,需要另一個文件的時候,就可以  
  用它設定,功能就相當于在代碼中使用#include<filename>  
  例子用法:  
  gcc hello.c -include /root/pianopan.h  
    
-imacros file  
  將file文件的宏,擴展到gcc/g++的輸入文件,宏定義本身并不出現在輸入文件  
  中  
    
-Dmacro  
  相當于C語言中的#define macro  
    
-Dmacro=defn  
  相當于C語言中的#define macro=defn  
    
-Umacro  
  相當于C語言中的#undef macro  

-undef  
  取消對任何非標準宏的定義  
    
-Idir  
  在你是用#include"file"的時候,gcc/g++會先在當前目錄查找你所制定的頭  
  文件,如果沒有找到,他回到缺省的頭文件目錄找,如果使用-I制定了目錄,他  
  回先在你所制定的目錄查找,然后再按常規的順序去找.  
  對于#include<file>,gcc/g++會到-I制定的目錄查找,查找不到,然后將到系  
  統的缺省的頭文件目錄查找  
    
-I-  
  就是取消前一個參數的功能,所以一般在-Idir之后使用  
    
-idirafter dir  
  在-I的目錄里面查找失敗,講到這個目錄里面查找.  
    
-iprefix prefix  
-iwithprefix dir  
  一般一起使用,當-I的目錄查找失敗,會到prefix+dir下查找  
    
-nostdinc  
  使編譯器不再系統缺省的頭文件目錄里面找頭文件,一般和-I聯合使用,明確  
  限定頭文件的位置  
    
-nostdin C++  
  規定不在g++指定的標準路經中搜索,但仍在其他路徑中搜索,.此選項在創建  
  libg++庫使用  
    
-C  
  在預處理的時候,不刪除注釋信息,一般和-E使用,有時候分析程序,用這個很  
  方便的  
    
-M  
  生成文件關聯的信息。包含目標文件所依賴的所有源代碼  
  你可以用gcc -M hello.c來測試一下,很簡單。  
    
-MM  
  和上面的那個一樣,但是它將忽略由#include<file>造成的依賴關系。  
    
-MD  
  和-M相同,但是輸出將導入到.d的文件里面  
    
-MMD  
  和-MM相同,但是輸出將導入到.d的文件里面  
    
-Wa,option  
  此選項傳遞option給匯編程序;如果option中間有逗號,就將option分成多個選  
  項,然后傳遞給會匯編程序  
    
-Wl.option  
  此選項傳遞option給連接程序;如果option中間有逗號,就將option分成多個選  
  項,然后傳遞給會連接程序.  
    

-llibrary   
  制定編譯的時候使用的庫  
  例子用法  
  gcc -lcurses hello.c  
  使用ncurses庫編譯程序  
    
-Ldir  
  制定編譯的時候,搜索庫的路徑。比如你自己的庫,可以用它制定目錄,不然  
  編譯器將只在標準庫的目錄找。這個dir就是目錄的名稱。  
    
-O0  
-O1  
-O2  
-O3  
  編譯器的優化選項的4個級別,-O0表示沒有優化,-O1為缺省值,-O3優化級別最  
  高    
    
-g  
  只是編譯器,在編譯的時候,產生條是信息。  
    
-gstabs  
  此選項以stabs格式聲稱調試信息,但是不包括gdb調試信息.  
    
-gstabs+  
  此選項以stabs格式聲稱調試信息,并且包含僅供gdb使用的額外調試信息.  
    
-ggdb  
  此選項將盡可能的生成gdb的可以使用的調試信息.  


[參考資料]  
-Linux/UNIX高級編程  
  中科紅旗軟件技術有限公司編著.清華大學出版社出版 

posted @ 2008-08-04 22:50 隨意門 閱讀(561) | 評論 (0)編輯 收藏
linux下gdb單步調試

     摘要: 用 GDB 調試程序 GDB 概述———— GDB 是 GNU 開源組織發布的一個強大的 UNIX 下的程序調試工具。或許,各位比較喜歡那種圖形界面方式的,像 VC 、 BCB 等 IDE 的調試,但如果你是在 UNIX 平臺下做軟件,你會發現 GDB 這個調試工具有比 VC 、 BCB 的圖形化調試器更強大的功能。所謂 “ 寸有所長,尺有所短 ” 就是這個道理。 一...  閱讀全文

posted @ 2008-08-04 15:30 隨意門 閱讀(2290) | 評論 (0)編輯 收藏
mysql查看表結構命令 (轉)

mysql查看表結構命令,如下:

desc 表名;
show columns from 表名;
describe 表名;
show create table 表名;

use information_schema
select * from columns where table_name='表名';

順便記下:
show databases;
use 數據庫名;
show tables;



原有一unique索引AK_PAS_Name(PAC_Name)在表tb_webparamcounter中,
執行以下sql修改索引
alter table tb_webparamcounter drop index AK_PAS_Name;
alter table tb_webparamcounter add UNIQUE AK_PAS_Name(PC_ID,PAC_Name);

若發現索引的邏輯不對,還需要再加一個字段進去,執行
alter table tb_webparamcounter drop index AK_PAS_Name;
alter table tb_webparamcounter add UNIQUE AK_PAS_Name(PC_ID,PAC_Name,PAC_Value);
注意:這時的PC_ID,PAC_Name,PAC_Value三個字段不是FOREIGN KEY
否則必需先drop FOREIGN KEY,再重做上一步才行

順便提下oracle
select * from v$database;
select * from all_users;
select * from user_tables;

posted @ 2008-07-31 14:16 隨意門 閱讀(874) | 評論 (0)編輯 收藏
一個多線程web服務器實例(C,Linux,詳細的web服務器原理)

     摘要: 系統:fedora core 5編譯器:g++實現功能:通過http協議,用瀏覽器查看服務器上的html,htm,jpg,jpeg,gif,png,css文件 ,或者說查看帶有jpg,jpeg,gif等文件的網頁,即是web~把代碼復制下來到linux里,照著后面的方法編譯、運行,就可以看到一個簡單的多線程服務器的效果了。 原理:在瀏覽器中輸入一個網址,回車之后,瀏覽器會向相應主機的相...  閱讀全文

posted @ 2008-07-02 09:49 隨意門 閱讀(4825) | 評論 (1)編輯 收藏
入門多線程服務器程序實例

fedora core 5
g++

服務器端程序:

#include <stdlib.h>

#include 
<sys/types.h>

#include 
<sys/socket.h>

#include 
<netinet/in.h>

#include 
<unistd.h>

#include 
<pthread.h>

#include 
<stdio.h>

#include 
<string.h>

#include 
<arpa/inet.h>



#define PORT 8848

#define BACKLOG 5

#define MAXDATASIZE 1000



void process_cli(int connectfd, sockaddr_in client);



void* start_routine(void* arg);

struct ARG {

       
int connfd;

       sockaddr_in client;

       };

       

main()

{

      
int listenfd, connectfd;

      pthread_t thread;         
//id of thread

      ARG 
*arg;

      
struct sockaddr_in server; //server's address info

      
struct sockaddr_in client; //client's

      
int sin_size;

      

      
//create tcp socket

      printf(
"socket.... ");

      
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

                    perror(
"creating socket failed.");

                    exit(
1);

      }

      

      
int opt = SO_REUSEADDR;

      setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, 
&opt, sizeof(opt));

      

      bzero(
&server,sizeof(server));

      server.sin_family 
= AF_INET;

      server.sin_port 
= htons(PORT);

      server.sin_addr.s_addr 
= htonl(INADDR_ANY);

      printf(
"bind.... ");

      
if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr)) == -1) {

          perror(
"bind error.");

          exit(
1);

      }

      

      printf(
"listen.... ");

      
if(listen(listenfd,BACKLOG) == -1) {

          perror(
"listen() error ");

          exit(
1);

      }



      sin_size 
= sizeof(struct sockaddr_in);

      
while(1)

      {

          
//accept() using main thread

          printf(
"accepting.... ");

          
if((connectfd = accept(listenfd,

                     (
struct sockaddr *)&client,

                     (socklen_t
*)&sin_size)) == -1) {

              perror(
"accept() error ");

              exit(
1);

          }



          arg 
= new ARG;

          arg
->connfd = connectfd;

          memcpy((
void *)&arg->client, &client, sizeof(client));

        

          
//invoke start_routine to handle this thread

          printf(
"thread_creating....");

          
if(pthread_create(&thread, NULL, start_routine, (void*)arg)){

              perror(
"pthread_creat() error");

              exit(
1);

          }          

      }

      close(listenfd);      

}



void process_cli(int connectfd, sockaddr_in client)

{

    
int num;

    
char recvbuf[MAXDATASIZE], sendbuf[MAXDATASIZE], cli_name[MAXDATASIZE];

    

    printf(
"you got a connection from %s.  ",inet_ntoa(client.sin_addr) );

    
//get client's name from client

    num 
= recv(connectfd, cli_name, MAXDATASIZE, 0);

    
if(num == 0) {

        close(connectfd);

        printf(
"Client disconnected. ");

        
return;

    }

    cli_name[num 
- 1= '

 客戶端代碼:

/* cthread.c */
#include 
<stdio.h>
#include 
<sys/types.h>
#include 
<netinet/in.h>
#include 
<sys/socket.h>
#include 
<netdb.h>
#include 
<unistd.h>
#include 
<string.h>
#include 
<arpa/inet.h>
#include 
<errno.h>
#include 
<stdlib.h>
#define PORT 8848
#define MAXDATASIZE 100

void process(FILE *fp, int sockfd);
char* getMessage(char* sendline, int len, FILE* fp);
int main(int argc, char *argv[])
{
    
int fd;
    
struct hostent *he;
    
struct sockaddr_in server; //server's address info

    
if(argc != 2) {
        printf(
"Usage: %s <ip address> ",argv[0]);
        exit(
1);
    }
    
    
if((he = gethostbyname(argv[1])) == NULL){
        perror(
"gethostbyname() error");
        exit(
1);
    }

    
if((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
        perror(
"socket() error");
        exit(
1);
    }

    bzero(
&server , sizeof(server));
    server.sin_family 
= AF_INET;
    server.sin_port 
= htons(PORT);
    server.sin_addr 
= *((struct in_addr *)he->h_addr);

    
if(connect(fd, (struct sockaddr *)&server,
                
sizeof(struct sockaddr)) == -1){
        perror(
"connect() error");
        exit(
1);
    }

    process(stdin,fd);

    close(fd);
}

void process(FILE *fp, int sockfd)
{
    
char sendline[MAXDATASIZE],recvline[MAXDATASIZE];
    
int numbytes;

    printf(
"connected to server. ");
    
//send name to server
    printf("Input name:");
    
if(fgets(sendline, MAXDATASIZE, fp) == NULL){
        printf(
" Exit. ");
        
return;
    }
    send(sockfd, sendline, strlen(sendline), 
0);

    
//send message to server
    
//when the string is not NULL , send another!
    while(getMessage(sendline,MAXDATASIZE,fp) != NULL) {
        send(sockfd, sendline, strlen(sendline), 
0);

        
if((numbytes = recv(sockfd, recvline, MAXDATASIZE, 0)) == 0){
            printf(
"server terminated. ");
            
return;
        }
        recvline[numbytes] 
= '

編譯命令:

g++ -g -o s sthread.c -pthread

g++ -g -o c cthread.c -lc -lnsl

啟動服務器:

./s

啟動客戶端:

./c 127.0.0.1

然后提示輸入客戶機的名字,再就提示輸入一串字符,然后服務器就反轉再發回來。

posted @ 2008-07-02 09:48 隨意門 閱讀(377) | 評論 (0)編輯 收藏
一個簡單的linux下網絡程序實例-網絡編程入門

系統:fedora core 5

服務器端程序:

/* server */
#include 
<stdio.h>
#include 
<sys/types.h>
#include 
<netinet/in.h>
#include 
<sys/socket.h>
#include 
<netdb.h>
#include 
<unistd.h>
#include 
<string.h>
#include 
<arpa/inet.h>

#define PORT 8848
#define BACKLOG 1

main()
{
    
int listenfd,connectfd;
    
struct sockaddr_in server;
    
struct sockaddr_in client;
    
int sin_size;

    
if (( listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror(
"Creating socket failed.");
        
return 0;
    }

    
int opt = SO_REUSEADDR;
    setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, 
&opt, sizeof(opt));

    bzero(
&server,sizeof(server));
    server.sin_family 
= AF_INET;
    server.sin_port 
= htons(PORT);
    server.sin_addr.s_addr 
= htonl(INADDR_ANY);

    printf(
"binding... ");
    
if(bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) {
        perror(
"Bind error");
        
return 0;
    }

    printf(
"listen... ");
    
if(listen(listenfd,BACKLOG) == -1){
        perror(
"listen() error ");
        
return 0;
    }
    printf(
"accept.... ");
    sin_size 
= sizeof(struct sockaddr_in);
    
if ((connectfd = accept(listenfd, (struct sockaddr *)&client,(socklen_t *&sin_size)) == -1) {
        perror(
"accept() error ");
        
return 0;
    }
    printf(
"you got a connection from %s ",inet_ntoa(client.sin_addr) );
    send(connectfd,
"welcome to my server. ",22,0);
    close(connectfd);
    close(listenfd);
}

客戶端程序:

/* client */
#include 
<stdio.h>
#include 
<sys/types.h>
#include 
<netinet/in.h>
#include 
<sys/socket.h>
#include 
<netdb.h>
#include 
<unistd.h>
#include 
<string.h>
#include 
<arpa/inet.h>
#include 
<errno.h>
#define PORT 8848
#define MAXDATASIZE 100

int main(int argc, char *argv[])
{
    
int fd, numbytes;
    
char buf[MAXDATASIZE];
    
struct hostent *he;
    
int errno;
    
struct sockaddr_in server;

    
if(argc != 2) {
        printf(
"usage: %s <ip address> ",argv[0]);
        
return 0;
    }
    printf(
"gethostbynem.... ");
    
if ((he = gethostbyname(argv[1]))==NULL){
        printf(
"gethostbyname() error ");
        
return 0;
    }
    
    
if((fd=socket(AF_INET,SOCK_STREAM, 0)) == -1){
        printf(
"socket() error ");
        
return 0;
    }
    
    
    bzero(
&server,sizeof(server));
    server.sin_family 
= AF_INET;
    server.sin_port 
= htons(PORT);
    server.sin_addr 
= *((in_addr*)he->h_addr);
    printf(
"connecting... ");
    
if(connect(fd, (struct sockaddr *)&server,sizeof(struct sockaddr)) == -1){
    
//    printf("connect() error ");
        perror("error");
        
return 0;
    }

    
if(( numbytes = recv(fd,buf,MAXDATASIZE,0)) == -1){
        printf(
"recv() error ");
        
return 0;
    }
    buf[numbytes] 
= '

 

 操作:

[root@localhost tcpsocket]# ls
help  tcpsocketC.c  tcpsocketS.c
[root@localhost tcpsocket]# g++ -g -o myserver tcpsocketS.c -lc -lnsl
[root@localhost tcpsocket]# g++ -g -o myclient tcpsocketC.c -lc -lnsl
[root@localhost tcpsocket]# ls
help  myclient  myserver  tcpsocketC.c  tcpsocketS.c
[root@localhost tcpsocket]# ./myserver
binding...
listen...
accept....

[root@localhost tcpsocket]# netstat -a | grep 8848
tcp        0      0 *:8848                      *:*                         LISTEN
[root@localhost tcpsocket]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:13:D4:3E:9F:89
          inet addr:125.221.160.241  Bcast:125.221.160.255  Mask:255.255.255.0
          inet6 addr: fe80::213:d4ff:fe3e:9f89/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:39108 errors:0 dropped:0 overruns:0 frame:0
          TX packets:46 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2359238 (2.2 MiB)  TX bytes:4040 (3.9 KiB)
          Interrupt:17 Base address:0xa000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:2005 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2005 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:2078171 (1.9 MiB)  TX bytes:2078171 (1.9 MiB)

[root@localhost tcpsocket]# ./myclient 127.0.0.1

 

posted @ 2008-07-02 09:47 隨意門 閱讀(360) | 評論 (0)編輯 收藏
僅列出標題
共9頁: 1 2 3 4 5 6 7 8 9 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区精品| 欧美电影在线播放| 亚洲国产美国国产综合一区二区| 噜噜噜久久亚洲精品国产品小说| 欧美日韩国产亚洲一区| 一本色道久久综合亚洲精品婷婷| 噜噜噜久久亚洲精品国产品小说| 亚洲午夜免费视频| av成人免费| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久狠狠久久综合桃花| 一区二区欧美国产| 一本色道婷婷久久欧美| av成人天堂| 欧美日韩和欧美的一区二区| 国产欧美欧美| 日韩一本二本av| 久热精品在线| 日韩午夜在线电影| 亚洲一二三级电影| 在线视频日本亚洲性| 国产精品欧美日韩一区二区| 欧美午夜大胆人体| 老司机精品视频网站| 蜜桃av一区二区| 在线观看欧美激情| 欧美三日本三级少妇三2023| 亚洲第一福利视频| 久久www成人_看片免费不卡| 亚洲免费成人av| 久久精精品视频| 国产欧美精品在线| 国产精品久久中文| 欧美一区二区三区男人的天堂| 国产情人综合久久777777| 先锋资源久久| 国产欧美日韩精品丝袜高跟鞋 | 中文亚洲欧美| 最新国产精品拍自在线播放| 亚洲欧美日本另类| 午夜亚洲福利| 久久久久久欧美| 久久乐国产精品| 久久夜色精品国产| 亚洲福利视频在线| 欧美在线播放视频| 欧美成人一区在线| 久久久97精品| 国产一区视频在线看| 你懂的亚洲视频| 久久精品男女| 久久精品观看| 亚洲一区图片| 好看的日韩视频| 国产自产女人91一区在线观看| 红桃视频一区| 亚洲国语精品自产拍在线观看| 久久久久久高潮国产精品视| 欧美午夜激情小视频| 亚洲成在线观看| 亚洲你懂的在线视频| 美女黄色成人网| 99视频精品免费观看| 久久天天躁夜夜躁狠狠躁2022 | 91久久在线| 日韩午夜av电影| 久久人人爽人人爽| 亚洲视频第一页| 久热精品在线| 国产欧美精品在线观看| av不卡在线观看| 欧美日韩日韩| 99亚洲视频| 国产一区二区三区自拍| 欧美一区二区日韩| 欧美激情91| 国产欧美日韩综合精品二区| 狠狠久久五月精品中文字幕| 欧美日韩精品久久| 久久久夜色精品亚洲| 国产一区二区三区免费观看 | 模特精品在线| 亚洲国产片色| 久久精品国产v日韩v亚洲 | 蜜桃伊人久久| 亚洲电影在线看| 亚洲乱码国产乱码精品精98午夜 | 久久久精品午夜少妇| 久久婷婷久久一区二区三区| 亚洲国产日韩一区二区| 国产日韩精品入口| 国产精品久久久久久久浪潮网站| 国产性天天综合网| 亚洲高清在线播放| 欧美国产日韩精品| 欧美刺激午夜性久久久久久久| 国产精品一级二级三级| 欧美日韩精品免费看| 欧美一区二区三区在线观看视频 | 国产亚洲人成a一在线v站| 久久综合亚州| 亚洲一区区二区| 亚洲成人在线网站| 国产亚洲免费的视频看| 欧美精品18+| 久久久www成人免费毛片麻豆| 欧美日韩国产麻豆| 亚洲伦理精品| 美女网站在线免费欧美精品| 久久综合伊人77777蜜臀| 黄色一区三区| 美女免费视频一区| 亚洲黄色av| 99亚洲视频| 国产精品久久久一区麻豆最新章节| 一二三区精品| 欧美在线免费观看亚洲| 免费成人性网站| 亚洲国产精选| 亚洲免费影视| 激情五月综合色婷婷一区二区| 久久综合九色欧美综合狠狠| 91久久午夜| 香蕉久久a毛片| 在线看视频不卡| 欧美日本国产| 午夜国产不卡在线观看视频| 免费在线看成人av| 在线亚洲一区| 黄色日韩精品| 欧美日韩国产首页在线观看| 亚洲欧美在线免费观看| 欧美国产日韩一区二区在线观看| 这里只有精品视频| 海角社区69精品视频| 欧美日本高清| 久久天堂国产精品| 亚洲网站在线观看| 欧美成人官网二区| 性做久久久久久| 亚洲精品日日夜夜| 国产婷婷精品| 欧美日韩综合在线| 久久综合福利| 亚洲欧美韩国| 日韩网站在线观看| 女女同性精品视频| 午夜精品区一区二区三| 91久久久久久久久久久久久| 国产精品网站视频| 欧美激情bt| 久久精品首页| 亚洲欧美日韩精品在线| 亚洲精品在线一区二区| 女女同性精品视频| 久久久久久网| 午夜精品久久久久久久99水蜜桃| 91久久中文| 伊人精品在线| 国产日韩欧美精品综合| 欧美色大人视频| 欧美v国产在线一区二区三区| 午夜精品免费视频| 一区二区欧美精品| 亚洲精品免费看| 亚洲第一在线视频| 你懂的视频欧美| 久久一区二区三区四区| 亚洲国产天堂久久综合网| 亚洲精品三级| 亚洲日韩第九十九页| 亚洲观看高清完整版在线观看| 国产午夜亚洲精品不卡| 国产精品视频免费一区| 国产精品www.| 国产精品久久午夜| 国产精品影片在线观看| 国产精品视频网站| 国产精品入口| 国产欧美激情| 国产一区二区精品丝袜| 国内精品久久国产| 尤物在线观看一区| 亚洲黄色精品| 一本色道久久加勒比88综合| 在线一区二区三区四区五区| 亚洲一区二区三区涩| 亚洲欧美电影院| 性一交一乱一区二区洋洋av| 久久成人精品| 蜜桃视频一区| 欧美屁股在线| 美腿丝袜亚洲色图| 欧美激情欧美狂野欧美精品| 最新成人av网站| 亚洲免费av网站| 午夜亚洲性色视频| 久久夜色撩人精品| 欧美日韩色一区| 国产毛片一区|