PSUbutu
http://psubuntu.com/wiki/InstallationInstructions/show?time=2009-12-08+23%3A31%3A45
安裝下載
http://cdimage.ubuntu.com/xubuntu/ports/releases/9.10/release/
星期六, 12月 12, 2009
星期日, 11月 29, 2009
庖丁分詞器(paoding)使用要注意的事
可以將字典位置設定在系統變數
也可以設定在paoding的jar檔中
的paoding-dic-home.properties
將原本的(系統環境變數)
#paoding.dic.home.config-fisrt=system-env
設定為(本檔案)
paoding.dic.home.config-fisrt=this
並且指定詞典位置
paoding.dic.home=E:/lib/paoding-analysis-2.0.4-beta/dic/
最後用zip檔案打開paoding-analysis.jar檔更新paoding-dic-home.properties
不要用記事本編輯字典(有BOM問題)
字典必須式UTF-8編碼
詞典修改完後要刪掉.compiled檔
也可以設定在paoding的jar檔中
的paoding-dic-home.properties
將原本的(系統環境變數)
#paoding.dic.home.config-fisrt=system-env
設定為(本檔案)
paoding.dic.home.config-fisrt=this
並且指定詞典位置
paoding.dic.home=E:/lib/paoding-analysis-2.0.4-beta/dic/
最後用zip檔案打開paoding-analysis.jar檔更新paoding-dic-home.properties
不要用記事本編輯字典(有BOM問題)
字典必須式UTF-8編碼
詞典修改完後要刪掉.compiled檔
星期四, 10月 29, 2009
CodeGear RAD Studio 2010出了喔
一般人也許不知道 codegear 是什麼產品,但 borland 這個曾經是程式設計開發工具的風雲人物,大家就不陌生了,
而 codegear 就是 borland 把程式設計開發工具(簡稱 ide)分割出來的產品(公司名embarcadero),
codegear rad studio 2010 為其最新力作,其中包含了delphi 、c++ builder、和 turbo c++ 等著名工具,
可開發 vcl、.net 和原生 win 32的程式,
其中 rad studio's delphi prism™ 可開發.net 和 mono (linux 版的 .net) 應用程式,並包含了最新的 .net技術,
例如asp.net, winforms, wpf 和 linq等。
如果剛剛接觸程式設計,想學 c/c++、pascal等,這個ide決對不可以錯過。
分享的版本為 architect 版,最高級版本喔
Delphi新版本(D2010)簡介:
1.多核的支持/異步方法(VC中早就擁有的OpenMP,在Delphi中也很快就有了)
2.內置的Direct 2D模塊及開發庫
3.將會擁有一個能同時運作於x86和x64的IDE,在此IDE下將會有跨平台編譯器,能夠編譯用於linux和MAC的應用程序。 (一次編碼+選擇編譯器=多個平台下可運行的副本,對於遊戲開發太有用了,我們再也沒有必要特地為linux或MAC開發遊戲,拿Windows下的代碼來重新編譯吧)
4.將會支持windows7下的觸摸式編程,對手勢事件的感知,比如說一個手指從屏幕劃過,或者兩個手指從上移動到下,甚至是用一個手掌來拍屏幕,這些不同的動作都能感知到,並且處理它們。 (Windows7的特性,微軟曾表示,會發布用於VC的Touch開發SDK,但是沒有計劃將該SDK集成到IDE,Delphi將是Win7下RAD Touch開發的領路者)
5.將會支持手持設備的開發,比如說工業的設備,或是手機
6.強化的DataSnap,將可以完美的支持在Delphi, C++Builder和Delphi Prism之間傳遞數據
7.可以調試數據庫中的存儲過程(Store Procedure)和函數(Function),並幫助數據庫找出問題
8.多人合作模式的進化,避免寫過多過長的代碼,CodeGear將進一步致力於減少代碼量,在提高開發效率的同時,也保證產品的質量(這才是Delphi的真正意義所在!! )
9.將支持雲計算(這個不用說了吧,現在廣為流行的雲計算)
10.將支持函數式編程,這需要很多時間,據David估計是兩年後會實現
以上的10條,足以讓我們激動了吧? Win7的特性,據我所知,微軟內部有SDK,但是卻從未打算在語言,或是IDE上體現出來,Delphi將在Touch Development上引領一個時代。同時,類似於Erlang的分佈式,函數式編程,雖說要比較久才能看到,但是由此我們看到了CodeGear的努力。
然後是一些FAQ,David親自回答了我們的問題,並且對Delphi的將來,他也是非常的樂觀
對於我們來說,我們自然是希望了解得越多越好,有些問題也問得很尖刻,但是David還是給出了讓我們較為滿意的答复
一、技術類
1. Delphi什麼時候能原生支持類似於parallel.for的多核並行開發?
[David] Delphi肯定會支持多核並行的開發,但是不是現在,可能是下一個版本
2.有計劃讓Delphi發展成類似於Erlang的分佈式語言嗎?是否會提供分佈式開發庫?
[David]似乎DataSnap已經能夠滿足類似的需求了,你可以用它來做分佈式應用。當然我們是有計劃實現分佈式的函數式編程的,這需要大幅修改編譯器
3. B/S開發能否加強?能否使用類似於JSP/PHP的模式?
[David]我們現在重點在VCL for the Web上,VCL for the Web 11和以往的版本相比有著天壤之別,它可以像一般的Delphi開發那樣,拖放式開發,也可以支持RIA。 VCL for the Web 11已經可以支持IIS等許多服務器了。我覺得它已經很強了。 (VCL for the Web 11已經可以被部署在支持IIS,Apache,ISAPI,NSAPI等各種服務器上,並且可以實現不需要本地運行時庫的RIA應用,比 Silverlight或是Flash都來得優越)
4.能否支持Native RIA?能否不需要用戶安裝類似於SilverLight的運行時庫
[David] VCL for the Web的目標與Silverlight不同(其他的內容參考上一條)
5.是否有計劃實現針對敏捷開發的Delphi Doc?
[David]新版本的Delphi會帶有一個Source Control System,用於滿足多人合作開發的需求,它的功能比單純的Document強得多
6. Delphi的類能否被序列化成XML?能否從XML加載一個類?
[David]從XML加載類是不可能的,類裡邊的方法不能夠通過XML來描述,我是指Native的語言都不可能這樣,如果想在Server和Client之間傳遞一個類的話,可以用DataSnap
7.什麼時候能支持x64的操作系統?
[David] x64的計劃很早就有了,但是我們沒有足夠的人力,估計還要再等下個版本,或許是2011年?
8.有打算支持跨平台嗎?特別是移動應用平台,如Symbian和Windows Mobile
[David]跨平台肯定會支持的,而且我們以前也做過kylix,但是很可惜的,Borland覺得kylix是浪費時間,於是終止了它。但是現在它又被提上日程了。 Windows Mobile?可以用Delphi Prism開發,其實我自己的感覺,用Visual Studio可能更好(David都認為開發WM的程序用.NET比較好,看來Delphi不太會往WM方向發展了)
二、意見類
9.反射機制能再做得好一點嗎?我們想放棄RTTI
[David]這的確是需要考慮的地方,當然RTTI我們不會放棄的
10.希望在支持Unicode的前提下,讓新版本的Delphi能兼容老版本的代碼
[David]很抱歉這是不可能的,從老版本移植代碼過來,由於Unicode的問題,必須修改一些代碼。我們也在努力的使這個修改變得更少。 (這點我個人還是難以認同的,理由還是那句話,為什麼VC可以而Delphi不行)
11. Delphi2009的bug多得難以忍受,不知Delphi2010是否會改善?
[David]現在的Update3應該沒有多少bug了吧?我記得上次修正了300多個問題,如果是用的早期版本,還是換上update 3吧。 Delphi2010會在Delphi2009 update3的基礎上進行改進,不會再帶上以前的bug的。
12. IDE是否能夠支持將Delphi代碼轉換成其他語言,並按用戶的喜好用不同的編譯器來編譯?
[David]不同的語言使用不同的運行時庫,就算語法上可以轉換,也無法將運行時庫轉換了。而且語法上的轉換也需要花費大量的勞動,並且沒有意義。
13. Embarcadero / CodeGear是否有計劃為Delphi編寫類似於微軟MSDN的文檔庫?
[David]我們有CDN,和MSDN差不多的,同樣的架構,而且現在也有很多人向QC提交內容,這些都會被收錄的。 CDN會越來越豐富,Delphi也可以自己更新到CDN的內容。(可以通過CDN查看網路上別人的開發經驗,這點比單純的幫助文檔好得多了,而且這次CG向CDN添加了大量的開發實例)
14. Delphi是否會支持內建的Python或是Perl,甚至是Ruby這樣的腳本?
[David]不會支持,據我所知已經有第三方的廠商支持了吧?
三、方向類
15. Delphi是否打算成為一個平台,是否會提出自己的標準?
[David]我不知道你所說的平台是指什麼,不過Delphi是一個RAD的,擁有很多控件的,能可視開發的工具,它的標準就是現行的標準。
16. Delphi的編譯器是否有開源的打算?
[David]不會開源,這是公司的商業模式決定的,我們還想靠編譯器來賺錢
17. Embarcadero / CodeGear如何看待用戶的體驗?
[David]我們對用戶的體驗非常重視,用戶有任何的問題都可以反饋到QC上來,我們會極積處理採納的。
18. Embarcadero / CodeGear如何看待來自FreePascal /Lazarus的競爭?
[David]我們從來沒有認為FreePascal或是Lazarus會對Delphi構成威脅,Delphi原本就是從Pascal擴展而來的,做了許許多多的擴充,現在組件也非常豐富了,而Lazarus的編譯器遠遠及不上Delphi,它還借用了許多原本屬於Delphi的庫,自己本身的組件很少。如果說跨平台的話,Delphi也很快就有了。 (CG還是很樂觀的,等Delphi的跨平檯面世後,lazarus還會有存活的餘地嗎?)
19. Embarcadero / CodeGear認為Delphi的主要發展方向是怎麼樣的?
[David]我當然希望它成為一個開發語言中的優秀者,最近的工作主要集中在DBX, DataSnap和跨平台的一些事情上。我們當然也希望用戶可以用Delphi來開發一切
部份文章 轉貼自
http://www.programbbs.com/bbs/view12-21556-1.htm
而 codegear 就是 borland 把程式設計開發工具(簡稱 ide)分割出來的產品(公司名embarcadero),
codegear rad studio 2010 為其最新力作,其中包含了delphi 、c++ builder、和 turbo c++ 等著名工具,
可開發 vcl、.net 和原生 win 32的程式,
其中 rad studio's delphi prism™ 可開發.net 和 mono (linux 版的 .net) 應用程式,並包含了最新的 .net技術,
例如asp.net, winforms, wpf 和 linq等。
如果剛剛接觸程式設計,想學 c/c++、pascal等,這個ide決對不可以錯過。
分享的版本為 architect 版,最高級版本喔
Delphi新版本(D2010)簡介:
1.多核的支持/異步方法(VC中早就擁有的OpenMP,在Delphi中也很快就有了)
2.內置的Direct 2D模塊及開發庫
3.將會擁有一個能同時運作於x86和x64的IDE,在此IDE下將會有跨平台編譯器,能夠編譯用於linux和MAC的應用程序。 (一次編碼+選擇編譯器=多個平台下可運行的副本,對於遊戲開發太有用了,我們再也沒有必要特地為linux或MAC開發遊戲,拿Windows下的代碼來重新編譯吧)
4.將會支持windows7下的觸摸式編程,對手勢事件的感知,比如說一個手指從屏幕劃過,或者兩個手指從上移動到下,甚至是用一個手掌來拍屏幕,這些不同的動作都能感知到,並且處理它們。 (Windows7的特性,微軟曾表示,會發布用於VC的Touch開發SDK,但是沒有計劃將該SDK集成到IDE,Delphi將是Win7下RAD Touch開發的領路者)
5.將會支持手持設備的開發,比如說工業的設備,或是手機
6.強化的DataSnap,將可以完美的支持在Delphi, C++Builder和Delphi Prism之間傳遞數據
7.可以調試數據庫中的存儲過程(Store Procedure)和函數(Function),並幫助數據庫找出問題
8.多人合作模式的進化,避免寫過多過長的代碼,CodeGear將進一步致力於減少代碼量,在提高開發效率的同時,也保證產品的質量(這才是Delphi的真正意義所在!! )
9.將支持雲計算(這個不用說了吧,現在廣為流行的雲計算)
10.將支持函數式編程,這需要很多時間,據David估計是兩年後會實現
以上的10條,足以讓我們激動了吧? Win7的特性,據我所知,微軟內部有SDK,但是卻從未打算在語言,或是IDE上體現出來,Delphi將在Touch Development上引領一個時代。同時,類似於Erlang的分佈式,函數式編程,雖說要比較久才能看到,但是由此我們看到了CodeGear的努力。
然後是一些FAQ,David親自回答了我們的問題,並且對Delphi的將來,他也是非常的樂觀
對於我們來說,我們自然是希望了解得越多越好,有些問題也問得很尖刻,但是David還是給出了讓我們較為滿意的答复
一、技術類
1. Delphi什麼時候能原生支持類似於parallel.for的多核並行開發?
[David] Delphi肯定會支持多核並行的開發,但是不是現在,可能是下一個版本
2.有計劃讓Delphi發展成類似於Erlang的分佈式語言嗎?是否會提供分佈式開發庫?
[David]似乎DataSnap已經能夠滿足類似的需求了,你可以用它來做分佈式應用。當然我們是有計劃實現分佈式的函數式編程的,這需要大幅修改編譯器
3. B/S開發能否加強?能否使用類似於JSP/PHP的模式?
[David]我們現在重點在VCL for the Web上,VCL for the Web 11和以往的版本相比有著天壤之別,它可以像一般的Delphi開發那樣,拖放式開發,也可以支持RIA。 VCL for the Web 11已經可以支持IIS等許多服務器了。我覺得它已經很強了。 (VCL for the Web 11已經可以被部署在支持IIS,Apache,ISAPI,NSAPI等各種服務器上,並且可以實現不需要本地運行時庫的RIA應用,比 Silverlight或是Flash都來得優越)
4.能否支持Native RIA?能否不需要用戶安裝類似於SilverLight的運行時庫
[David] VCL for the Web的目標與Silverlight不同(其他的內容參考上一條)
5.是否有計劃實現針對敏捷開發的Delphi Doc?
[David]新版本的Delphi會帶有一個Source Control System,用於滿足多人合作開發的需求,它的功能比單純的Document強得多
6. Delphi的類能否被序列化成XML?能否從XML加載一個類?
[David]從XML加載類是不可能的,類裡邊的方法不能夠通過XML來描述,我是指Native的語言都不可能這樣,如果想在Server和Client之間傳遞一個類的話,可以用DataSnap
7.什麼時候能支持x64的操作系統?
[David] x64的計劃很早就有了,但是我們沒有足夠的人力,估計還要再等下個版本,或許是2011年?
8.有打算支持跨平台嗎?特別是移動應用平台,如Symbian和Windows Mobile
[David]跨平台肯定會支持的,而且我們以前也做過kylix,但是很可惜的,Borland覺得kylix是浪費時間,於是終止了它。但是現在它又被提上日程了。 Windows Mobile?可以用Delphi Prism開發,其實我自己的感覺,用Visual Studio可能更好(David都認為開發WM的程序用.NET比較好,看來Delphi不太會往WM方向發展了)
二、意見類
9.反射機制能再做得好一點嗎?我們想放棄RTTI
[David]這的確是需要考慮的地方,當然RTTI我們不會放棄的
10.希望在支持Unicode的前提下,讓新版本的Delphi能兼容老版本的代碼
[David]很抱歉這是不可能的,從老版本移植代碼過來,由於Unicode的問題,必須修改一些代碼。我們也在努力的使這個修改變得更少。 (這點我個人還是難以認同的,理由還是那句話,為什麼VC可以而Delphi不行)
11. Delphi2009的bug多得難以忍受,不知Delphi2010是否會改善?
[David]現在的Update3應該沒有多少bug了吧?我記得上次修正了300多個問題,如果是用的早期版本,還是換上update 3吧。 Delphi2010會在Delphi2009 update3的基礎上進行改進,不會再帶上以前的bug的。
12. IDE是否能夠支持將Delphi代碼轉換成其他語言,並按用戶的喜好用不同的編譯器來編譯?
[David]不同的語言使用不同的運行時庫,就算語法上可以轉換,也無法將運行時庫轉換了。而且語法上的轉換也需要花費大量的勞動,並且沒有意義。
13. Embarcadero / CodeGear是否有計劃為Delphi編寫類似於微軟MSDN的文檔庫?
[David]我們有CDN,和MSDN差不多的,同樣的架構,而且現在也有很多人向QC提交內容,這些都會被收錄的。 CDN會越來越豐富,Delphi也可以自己更新到CDN的內容。(可以通過CDN查看網路上別人的開發經驗,這點比單純的幫助文檔好得多了,而且這次CG向CDN添加了大量的開發實例)
14. Delphi是否會支持內建的Python或是Perl,甚至是Ruby這樣的腳本?
[David]不會支持,據我所知已經有第三方的廠商支持了吧?
三、方向類
15. Delphi是否打算成為一個平台,是否會提出自己的標準?
[David]我不知道你所說的平台是指什麼,不過Delphi是一個RAD的,擁有很多控件的,能可視開發的工具,它的標準就是現行的標準。
16. Delphi的編譯器是否有開源的打算?
[David]不會開源,這是公司的商業模式決定的,我們還想靠編譯器來賺錢
17. Embarcadero / CodeGear如何看待用戶的體驗?
[David]我們對用戶的體驗非常重視,用戶有任何的問題都可以反饋到QC上來,我們會極積處理採納的。
18. Embarcadero / CodeGear如何看待來自FreePascal /Lazarus的競爭?
[David]我們從來沒有認為FreePascal或是Lazarus會對Delphi構成威脅,Delphi原本就是從Pascal擴展而來的,做了許許多多的擴充,現在組件也非常豐富了,而Lazarus的編譯器遠遠及不上Delphi,它還借用了許多原本屬於Delphi的庫,自己本身的組件很少。如果說跨平台的話,Delphi也很快就有了。 (CG還是很樂觀的,等Delphi的跨平檯面世後,lazarus還會有存活的餘地嗎?)
19. Embarcadero / CodeGear認為Delphi的主要發展方向是怎麼樣的?
[David]我當然希望它成為一個開發語言中的優秀者,最近的工作主要集中在DBX, DataSnap和跨平台的一些事情上。我們當然也希望用戶可以用Delphi來開發一切
部份文章 轉貼自
http://www.programbbs.com/bbs/view12-21556-1.htm
星期日, 10月 25, 2009
TDD開發模式
今天讀了旗標出的Ruby on Rails 黑黃書
裡面講到了TDD開發模式,引起了好奇
上網找了相關的資料,發現國內沒什麼人在討論
TDD開發就書上的定義:
TDD開發模式!!
?
撰寫一段功能程式碼
確定測試失敗(因為還沒建立功能)
只撰寫可以測試成功的程式碼
重構程式碼,確保它的設計對當時來說是最精簡的
以上是他的,中心思想-快速開發,使用者取向
?就像射箭,先畫好紅心,一直修改射箭姿勢,直到射中為止
其他的就先不要管,先求有再求好
開發敏捷~~先讓程式碼長眼睛,明確的目標寫,可以節省需多時間。
TDD
http://wiki.pragmatus.com/index.php?title=Test_Driven_Development_with_Ruby
裡面講到了TDD開發模式,引起了好奇
上網找了相關的資料,發現國內沒什麼人在討論
TDD開發就書上的定義:
TDD開發模式!!
?
撰寫一段功能程式碼
確定測試失敗(因為還沒建立功能)
只撰寫可以測試成功的程式碼
重構程式碼,確保它的設計對當時來說是最精簡的
以上是他的,中心思想-快速開發,使用者取向
?就像射箭,先畫好紅心,一直修改射箭姿勢,直到射中為止
其他的就先不要管,先求有再求好
開發敏捷~~先讓程式碼長眼睛,明確的目標寫,可以節省需多時間。
TDD
http://wiki.pragmatus.com/index.php?title=Test_Driven_Development_with_Ruby
星期五, 9月 11, 2009
CentOS ISO In TAIWAN
目前想在台灣快速的取得CentOS的ISO,可以從學術網路中下載。
國家高速網路與計算中心:http://ftp.twaren.net/Linux/CentOS/
義守大學:http://ftp.isu.edu.tw/pub/Linux/CentOS/
元智資訊工程學系:http://ftp.cse.yzu.edu.tw/pub/CentOS/
靜宜大學資訊學院:http://ftp.cs.pu.edu.tw/Linux/CentOS/
國家高速網路與計算中心:http://ftp.twaren.net/Linux/CentOS/
義守大學:http://ftp.isu.edu.tw/pub/Linux/CentOS/
元智資訊工程學系:http://ftp.cse.yzu.edu.tw/pub/CentOS/
靜宜大學資訊學院:http://ftp.cs.pu.edu.tw/Linux/CentOS/
星期六, 6月 06, 2009
星期二, 2月 24, 2009
星期一, 2月 09, 2009
wxWidgets建立按鈕
在wxWidgets中新增一個按鈕元件
要使按鈕元件可以動作
要先注意到定義按鈕、監聽按鈕事件、處理函式
在標頭檔定義處理函式
void OnButtonOK(wxCommandEvent& event);
定義按鈕(這部分IDE會幫你做好)
WxButton1 = new wxButton(this, ID_WXBUTTON1, wxT("確定"), wxPoint(424,424), wxSize(75,25), 0, wxDefaultValidator, wxT("WxButton1"));
WxButton1->SetFont(wxFont(9, wxSWISS, wxNORMAL,wxNORMAL, false, wxT("微軟正黑體")));
建立監聽
EVT_BUTTON(ID_WXBUTTON1, p1Frm::OnButtonOK)
^^^^^^按鈕ID ^^^^^^^^^處理函式
監聽需要在BEGIN_EVENT_TABLE和END_EVENT_TABLE之間
再來就是定義函式
void p1Frm::OnButtonOK(wxCommandEvent& event)
{
Destroy();
}
要使按鈕元件可以動作
要先注意到定義按鈕、監聽按鈕事件、處理函式
在標頭檔定義處理函式
void OnButtonOK(wxCommandEvent& event);
定義按鈕(這部分IDE會幫你做好)
WxButton1 = new wxButton(this, ID_WXBUTTON1, wxT("確定"), wxPoint(424,424), wxSize(75,25), 0, wxDefaultValidator, wxT("WxButton1"));
WxButton1->SetFont(wxFont(9, wxSWISS, wxNORMAL,wxNORMAL, false, wxT("微軟正黑體")));
建立監聽
EVT_BUTTON(ID_WXBUTTON1, p1Frm::OnButtonOK)
^^^^^^按鈕ID ^^^^^^^^^處理函式
監聽需要在BEGIN_EVENT_TABLE和END_EVENT_TABLE之間
再來就是定義函式
void p1Frm::OnButtonOK(wxCommandEvent& event)
{
Destroy();
}
星期日, 2月 08, 2009
[Linker Error] undefined reference to `__cpu_features_init'錯誤
在安裝完wxDev-C++第一次編譯
出現[Linker Error] undefined reference to `__cpu_features_init'
編譯錯誤的訊息
找了一下Google大神,發現是編譯器環境設定的錯誤
將設定調整如下
工具→編譯器選項→目錄→函式庫
新增一筆C:\MinGW\lib
就可以正常使用
前提是要先裝MinGW
出現[Linker Error] undefined reference to `__cpu_features_init'
編譯錯誤的訊息
找了一下Google大神,發現是編譯器環境設定的錯誤
將設定調整如下
工具→編譯器選項→目錄→函式庫
新增一筆C:\MinGW\lib
就可以正常使用
前提是要先裝MinGW
不使用VC開發桌面程式
在Windows下想使用C++開發桌面環境
而不使用VC,可以嘗試使用Dev c++
配合GTK+或wxWidgets來開發桌面程式
很多人在桌面環境開發都使用VC,那是
需要付費的商業版本,如果有預算上面
的考量可以考慮Dev C++來當作開發工
具,也是一種不錯的選擇。
wx-devcpp(wxDev-c++)是一套將wxWidget
(誇平台)和Dev c++整合,減少自行整合
設定的麻煩。
下載點
相關教學
http://pcnoproblem.twbbs.org/2008/09/20/wxdevc/
而不使用VC,可以嘗試使用Dev c++
配合GTK+或wxWidgets來開發桌面程式
很多人在桌面環境開發都使用VC,那是
需要付費的商業版本,如果有預算上面
的考量可以考慮Dev C++來當作開發工
具,也是一種不錯的選擇。
wx-devcpp(wxDev-c++)是一套將wxWidget
(誇平台)和Dev c++整合,減少自行整合
設定的麻煩。
下載點
相關教學
http://pcnoproblem.twbbs.org/2008/09/20/wxdevc/
CPP的socket設定
Server.exe PortNumber,例如Server 8000
Client.exe IPAddress PortNumber,例如Client 127.0.0.1 8000
然後在用戶端的命令列輸入字串,用戶端將會把消息送到伺服器,伺服器再把消息傳回用戶端。
伺服器端,Server.cpp
//Server.cpp
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
int main(int argc, char* argv[]){
//判斷是否輸入了PORT號
if(argc!=2){
printf("Usage: %s PortNumber\n",argv[0]);
exit(-1);
}
//將PORT號轉化為整數
short port;
if((port = atoi(argv[1]))==0){
printf("PORT號指定為整數");
exit(-1);
}
WSADATA wsa;
//初始化套接字DLL
if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){
printf("Socket初始化失敗!");
exit(-1);
}
//創建Socket
SOCKET serverSocket;
if((serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){
printf("創建Socket失敗!");
exit(-1);
}
struct sockaddr_in serverAddress;
memset(&serverAddress,0,sizeof(sockaddr_in));
serverAddress.sin_family=AF_INET;
serverAddress.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
serverAddress.sin_port = htons(port);
//綁定
if(bind(serverSocket,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR){
printf("Socket绑定到PORT失敗!端口: %d\n",port);
exit(-1);
}
//進入監聽狀態
if(listen(serverSocket,SOMAXCONN)==SOCKET_ERROR){
printf("監聽失敗!");
exit(-1);
}
printf("Server %d is listening......\n",port);
SOCKET clientSocket;//用來和用戶端通信的Socket
struct sockaddr_in clientAddress;//用來和用戶端通信的Socket地址
memset(&clientAddress,0,sizeof(clientAddress));
int addrlen = sizeof(clientAddress);
//接受連接
if((clientSocket=accept(serverSocket,(sockaddr*)&clientAddress,&addrlen))==INVALID_SOCKET){
printf("接受客户端連接失敗!");
exit(-1);
}
printf("Accept connection from %s\n",inet_ntoa(clientAddress.sin_addr));
char buf[4096];
while(1){
//接收數據
int bytes;
if((bytes=recv(clientSocket,buf,sizeof(buf),0))==SOCKET_ERROR){
printf("接收數據失敗!\n");
exit(-1);
}
buf[bytes]='\0';
printf("Message from %s: %s\n",inet_ntoa(clientAddress.sin_addr),buf);
if(send(clientSocket,buf,bytes,0)==SOCKET_ERROR){
printf("傳送數據失败!");
exit(-1);
}
}
//清理Socket占用的資源
WSACleanup();
return 0;
}
用戶端,Client.cpp
//Client.cpp
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
int main(int argc, char* argv[]){
//判斷是否輸入了IP地址和Port
if(argc!=3){
printf("Usage: %s IPAddress PortNumber\n",argv[0]);
exit(-1);
}
//把字符的IP地址轉化为u_long
unsigned long ip;
if((ip=inet_addr(argv[1]))==INADDR_NONE){
printf("不合法的IP地址:%s",argv[1]);
exit(-1);
}
//把port轉化成整数
short port;
if((port = atoi(argv[2]))==0){
printf("Port有誤!");
exit(-1);
}
printf("Connecting to %s:%d......\n",inet_ntoa(*(in_addr*)&ip),port);
WSADATA wsa;
//初始化套接字DLL
if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){
printf("套接字初始化失败!");
exit(-1);
}
//创建套接字
SOCKET sock;
if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){
printf("创建套接字失败!");
exit(-1);
}
struct sockaddr_in serverAddress;
memset(&serverAddress,0,sizeof(sockaddr_in));
serverAddress.sin_family=AF_INET;
serverAddress.sin_addr.S_un.S_addr = ip;
serverAddress.sin_port = htons(port);
//建立和服务器的连接
if(connect(sock,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR){
printf("建立连接失败!");
exit(-1);
}
char buf[4096];
while(1){
printf(">");
//从控制台读取一行数据
gets(buf);
//发送给服务器
if(send(sock,buf,strlen(buf),0)==SOCKET_ERROR){
printf("发送数据失败!");
exit(-1);
}
int bytes;
if((bytes=recv(sock,buf,sizeof(buf),0))==SOCKET_ERROR){
printf("接收數據失败!\n");
exit(-1);
}
buf[bytes]='\0';
printf("Message from %s: %s\n",inet_ntoa(serverAddress.sin_addr),buf);
}
//清理套接字占用的资源
WSACleanup();
return 0;
}
參考資料:
小新a家
http://www.wretch.cc/blog/mntkey/21030760
如何使用DevCpp寫Socket程式
http://www.twbbs.net.tw/2090793.html
Client.exe IPAddress PortNumber,例如Client 127.0.0.1 8000
然後在用戶端的命令列輸入字串,用戶端將會把消息送到伺服器,伺服器再把消息傳回用戶端。
伺服器端,Server.cpp
//Server.cpp
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
int main(int argc, char* argv[]){
//判斷是否輸入了PORT號
if(argc!=2){
printf("Usage: %s PortNumber\n",argv[0]);
exit(-1);
}
//將PORT號轉化為整數
short port;
if((port = atoi(argv[1]))==0){
printf("PORT號指定為整數");
exit(-1);
}
WSADATA wsa;
//初始化套接字DLL
if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){
printf("Socket初始化失敗!");
exit(-1);
}
//創建Socket
SOCKET serverSocket;
if((serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){
printf("創建Socket失敗!");
exit(-1);
}
struct sockaddr_in serverAddress;
memset(&serverAddress,0,sizeof(sockaddr_in));
serverAddress.sin_family=AF_INET;
serverAddress.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
serverAddress.sin_port = htons(port);
//綁定
if(bind(serverSocket,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR){
printf("Socket绑定到PORT失敗!端口: %d\n",port);
exit(-1);
}
//進入監聽狀態
if(listen(serverSocket,SOMAXCONN)==SOCKET_ERROR){
printf("監聽失敗!");
exit(-1);
}
printf("Server %d is listening......\n",port);
SOCKET clientSocket;//用來和用戶端通信的Socket
struct sockaddr_in clientAddress;//用來和用戶端通信的Socket地址
memset(&clientAddress,0,sizeof(clientAddress));
int addrlen = sizeof(clientAddress);
//接受連接
if((clientSocket=accept(serverSocket,(sockaddr*)&clientAddress,&addrlen))==INVALID_SOCKET){
printf("接受客户端連接失敗!");
exit(-1);
}
printf("Accept connection from %s\n",inet_ntoa(clientAddress.sin_addr));
char buf[4096];
while(1){
//接收數據
int bytes;
if((bytes=recv(clientSocket,buf,sizeof(buf),0))==SOCKET_ERROR){
printf("接收數據失敗!\n");
exit(-1);
}
buf[bytes]='\0';
printf("Message from %s: %s\n",inet_ntoa(clientAddress.sin_addr),buf);
if(send(clientSocket,buf,bytes,0)==SOCKET_ERROR){
printf("傳送數據失败!");
exit(-1);
}
}
//清理Socket占用的資源
WSACleanup();
return 0;
}
用戶端,Client.cpp
//Client.cpp
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
int main(int argc, char* argv[]){
//判斷是否輸入了IP地址和Port
if(argc!=3){
printf("Usage: %s IPAddress PortNumber\n",argv[0]);
exit(-1);
}
//把字符的IP地址轉化为u_long
unsigned long ip;
if((ip=inet_addr(argv[1]))==INADDR_NONE){
printf("不合法的IP地址:%s",argv[1]);
exit(-1);
}
//把port轉化成整数
short port;
if((port = atoi(argv[2]))==0){
printf("Port有誤!");
exit(-1);
}
printf("Connecting to %s:%d......\n",inet_ntoa(*(in_addr*)&ip),port);
WSADATA wsa;
//初始化套接字DLL
if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){
printf("套接字初始化失败!");
exit(-1);
}
//创建套接字
SOCKET sock;
if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){
printf("创建套接字失败!");
exit(-1);
}
struct sockaddr_in serverAddress;
memset(&serverAddress,0,sizeof(sockaddr_in));
serverAddress.sin_family=AF_INET;
serverAddress.sin_addr.S_un.S_addr = ip;
serverAddress.sin_port = htons(port);
//建立和服务器的连接
if(connect(sock,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR){
printf("建立连接失败!");
exit(-1);
}
char buf[4096];
while(1){
printf(">");
//从控制台读取一行数据
gets(buf);
//发送给服务器
if(send(sock,buf,strlen(buf),0)==SOCKET_ERROR){
printf("发送数据失败!");
exit(-1);
}
int bytes;
if((bytes=recv(sock,buf,sizeof(buf),0))==SOCKET_ERROR){
printf("接收數據失败!\n");
exit(-1);
}
buf[bytes]='\0';
printf("Message from %s: %s\n",inet_ntoa(serverAddress.sin_addr),buf);
}
//清理套接字占用的资源
WSACleanup();
return 0;
}
參考資料:
小新a家
http://www.wretch.cc/blog/mntkey/21030760
如何使用DevCpp寫Socket程式
http://www.twbbs.net.tw/2090793.html
訂閱:
文章 (Atom)