龍雲堯個人博客,轉載請註明出處。
CSDN地址:http://blog.csdn.net/Michael753951/article/details/72553287
個人blog地址:http://yaoyl.cn/ubuntu-xia-jin-xing-socket-bian-cheng/
這是第一次進行網絡編程,獻給Ubuntu了。
由於需要結合OpenGL搭建的虛擬環境進行實驗,爲了將虛擬環境中的實驗參數傳送至另一臺PC機協同工作。我們選擇使用網絡編程進行數據通行。本次博客先運行兩個demo體會一下利用C++進行Socket編程。
實驗進行
我們在本次實驗中將運行兩個demo,第一個demo用來進行文件傳輸,第二個demo用來進行窗口對話。
demo1
本次demo採用TCP流,demo代碼來自【 Linux網絡編程:socket文件傳輸範例 】。
代碼編寫
我們打開codeblocks,建立兩個項目(project),新建的時候選擇控制檯(console)程序。第一個項目命名爲“TCP_client”,第二個項目命名爲“TCP_server”。然後將博客中的代碼拷貝進main.cpp中,ctrl+F9進行編譯。
注意,在這裏當我們編譯到 close(new_server_socket_fd);
的時候,編譯器會報錯 error: ‘close’ was not declared in this scope
。如下圖所示。
我參考CSDN中【‘close’ was not declared in this scope 】添加了unistd.h庫頭,編譯成功。
#include<unistd.h>
在TCP_server編譯成功之後,我們開始編譯TCP_client。同樣在將客戶端複製下來之後,我們首先添加unistd.h庫頭,接着我們直接編譯。
首先是在編譯到if(inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) == 0)
的時候,編譯器報error: ‘inet_pton’ was not declared in this scope
錯誤如下圖所示。
我參考了CSDN中【‘inet_pton’ was not declared in this scope 】添加了arpa/inet.h庫頭。
#include <arpa/inet.h>
再次編譯的時候,依然遇到了報錯。此時在編譯到close(fp);
的時候報錯error: invalid conversion from ‘FILE* {aka _IO_FILE*}’ to ‘int’ [-fpermissive]
。如下圖所示。
我們發現本行代碼中fp爲文件指針,在C語言中,文件的打開和關閉應該是調用fopen和fclose,在打開文件部分,作者確實調用了fopen進行打開文件,但是在關閉的時候錯用成了close,所以造成本次報錯,我們將close換成fclose,就能夠編譯成功了。
執行項目
我們在兩份項目都能夠正確編譯執行以後,將開始正式進行實驗。
首先關閉當前IDE,因爲在codeblocks中,不能在同一個進程中打開兩個main函數。我們需要分別進入之前已經建立好的TCP_server項目所在的文件夾和TCP_client項目所在的文件夾,分別代開他們的cbp文件,打開兩個codeblocks進程,這樣就能夠同時打開兩個console窗口了。(如果不能同時打開的話,可以剎參考CSDN中【CodeBlocks啓動多個進程實例的做法 】的設置方法)
打開後server和client兩個界面如圖所示。
首先我們在server所在的文件夾中放置一個demo.jpeg文件作爲源文件,然後我們可以發現此時client所在的文件夾中沒有該文件。接着我們在TCP_client窗口中輸入demo.jpeg
。
我們發現執行成功之後,client所在的文件夾中多出來了一個demo.jpeg文件,打開它和server中的demo.jpeg進行對比,發現結果一致。
故而我們認爲本次demo運行沒問題。
demo2
第二份demo參考自【Linux C Socket編程原理及簡單實例】。
本次代碼能夠直接編譯運行,不會有報錯信息,測試截圖如下所示。
小結
本次demo作爲Socket編程的入門測試以及環境測試,下一篇博客將對Socket編程進行深入的分析的總結。