|
本章節使用的資料已經放到了開發板網盤資料中,路徑為:“11_Linux 系統開發進階\78_章節_網絡通信-套字節 UDP 使用資料”。 iTOP-IMX6ULL 實現基于 UDP 的 socket 編程。 78.1 實驗操作 UDP 是用戶數據報協議,它是一種無連接的傳輸層協議,提供面向事物的簡單不可靠信息傳送服務,所以在一些網絡質量不滿意的環境下,UDP 協議數據包丟失會比較嚴重,會造成數據的丟失。UDP 的特點是它不屬于連接型協議,所以資源消耗小。處理速度快的優點,所以通常音頻,視頻和普通數據在傳送時使用 UDP 較多,因為它們即使偶爾丟失一兩個數據包,也不會對接收結果產生太大影響。 UDP 的通信框圖如圖 78.1.1 所示
從上圖可以看到基于 UDP 通信的程序也是由服務器和客戶端組成。與 TCP 的服務器不同,UDP 的服務器不需要 listen 和 accept 函數,客戶端不需要 connect 函數。下面通過一個例子來了解一下 UDP 的應用程序,首先來看下服務器(server)端的程序。
上面的代碼和前面一章的 TCP 的服務器程序差不多,首先也是定義一些變量,然后調用 socket 函數創建一個套接字,這里 socket 函數的第二個參數是 SOCK_DGRAM,即用戶數據報,也就是創建的 UDP 連接,然后調用 bzero 函數清空變量 servaddr 的值,然后設置 servaddr 結構的值,接著調用 bind 綁定函數,然后調用 recvfrom 函數直接接收數據,而沒有調用 listen 和 accept 函數。 下面來看看客戶端(client)的程序 client.c:
客戶端(client)的程序首先是定義一些使用的變量,然后也是調用 socket 函數創建一個套接字,socket 函數的第二個參數是 SOCK_DGRAM,即用戶數據報,也就是 UDP 連接,然后調用 bzero 函數把servaddr 結構的變量清零,然后設置 servaddr 結構變量的值,然后調用 sendto 發送函數,這里客戶端程序沒有調用 bind 函數和 connect 函數。現在使用命令。 gcc -o server server.c 執行結果如圖 78.1.2:
使用命令 arm-none-linux-gnueabi-gcc -o client client.c 編譯 client.c,執行結果如圖 78.1.3。
把生成的 client 拷貝到 NFS 共享目錄中,如圖 78.1.4
然后在虛擬機 Ubuntu 上運行 server 程序,如圖 78.1.5。
在 iTOP-IMX6ULL 開發板上運行 client 程序,如圖 78.1.6。
現在看下虛擬機 Ubuntu 的 server 程序的輸出,如圖 78.1.7:
可以看到 server 程序輸出“Hello,word”,上面的打印信息就是 client 發送的數據。至此基于 UDP的 socket 通訊就實現了。
|