Ubuntu下進行Socket編程

龍雲堯個人博客,轉載請註明出處。

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。如下圖所示。

tcp_server_error

我參考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錯誤如下圖所示。

tcp_client_error_1

我參考了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]。如下圖所示。

tcp_client_error_2

我們發現本行代碼中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編程原理及簡單實例】

本次代碼能夠直接編譯運行,不會有報錯信息,測試截圖如下所示。

demo2

小結

本次demo作爲Socket編程的入門測試以及環境測試,下一篇博客將對Socket編程進行深入的分析的總結。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章