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