色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

Hi,歡迎來到嵌入式培訓高端品牌 - 華清遠見教育科技集團<北京總部官網>,專注嵌入式工程師培養15年!
當前位置: > 華清遠見教育科技集團 > 嵌入式學習 > 講師博文 > UDP通訊方式及編程實現步驟
UDP通訊方式及編程實現步驟
時間:2017-01-04作者:華清遠見

網絡編程的目的就是指直接或間接地通過網絡協議與其他計算機進行通訊。目前較為流行的網絡編程模型是客戶機/服務器(Client/Server)結構,即通信雙方一方作為服務器等待客戶提出請求并予以響應,客戶則在需要服務時向服務器提出申請。服務器一般作為守護進程始終運行,監聽網絡端口,一旦有客戶請求,就會啟動一個服務進程來響應該客戶,同時自己繼續監聽服務端口,使后來的客戶也能及時得到服務。

UDP協議是User Datagram Protocol的簡稱,是一種無連接的協議,每個數據報都是一個獨立的信息,包括完整的源地址或目的地址,它在網絡上以任何可能的路徑傳往目的地,因此能否到達目的地,到達目的地的時間以及內容的正確性都是不能被保證的。

既然有了保證可靠傳輸的TCP協議,為什么還要非可靠傳輸的UDP協議呢?主要的原因有兩個。一是可靠的傳輸是要付出代價的,對數據內容正確性的檢驗必然占用計算機的處理時間和網絡的帶寬,因此TCP傳輸的效率不如UDP高。二是在許多應用中并不需要保證嚴格的傳輸可靠性,比如視頻會議系統,并不要求音頻視頻數據絕對的正確,只要保證連貫性就可以了,這種情況下顯然使用UDP會更合理一些。

UDP編程的服務器端一般步驟是:

1、創建一個socket,用函數socket();
        2、設置socket屬性,用函數setsockopt();* 可選
        3、綁定IP地址、端口等信息到socket上,用函數bind();
        4、循環接收數據,用函數recvfrom();
        5、關閉網絡連接;

UDP編程的客戶端一般步驟是:

1、創建一個socket,用函數socket();
        2、設置socket屬性,用函數setsockopt();* 可選
        3、綁定IP地址、端口等信息到socket上,用函數bind();* 可選
        4、設置對方的IP地址和端口等屬性;
        5、發送數據,用函數sendto();
        6、關閉網絡連接;

UDP通訊服務器端源代碼如下:

#include <stdio.h>
        #include <string.h>
        #include <sys/types.h>
        #include <netinet/in.h>
        #include <sys/socket.h>
        #include <errno.h>
        #include <stdlib.h>
        #include <arpa/inet.h>
        int main(int argc, char **argv)
        {
        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;
        int sock;
        socklen_t addr_len;
        int len;
        char buff[128];

/* 創建 socket , 關鍵在于這個 SOCK_DGRAM */
        if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        perror("socket");
        exit(errno);
        } else
        printf("create socket.\n\r");

memset(&s_addr, 0, sizeof(struct sockaddr_in));
        /* 設置地址和端口信息 */
        s_addr.sin_family = AF_INET;
        if (argv[2])
        s_addr.sin_port = htons(atoi(argv[2]));
        else
        s_addr.sin_port = htons(7838);
        if (argv[1])
        s_addr.sin_addr.s_addr = inet_addr(argv[1]);
        else
        s_addr.sin_addr.s_addr = INADDR_ANY;

/* 綁定地址和端口信息 */
        if ((bind(sock, (struct sockaddr *) &s_addr, sizeof(s_addr))) == -1) {
        perror("bind");
        exit(errno);
        } else
        printf("bind address to socket.\n\r");

/* 循環接收數據 */
        addr_len = sizeof(c_addr);
        while (1) {
        len = recvfrom(sock, buff, sizeof(buff) - 1, 0,
        (struct sockaddr *) &c_addr, &addr_len);
        if (len < 0) {
        perror("recvfrom");
        exit(errno);

buff[len] = '\0';
        printf("收到來自%s:%d的消息:%s\n\r",
        inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port), buff);
        }
        return 0;
        }

客戶端源代碼如下:

#include <stdio.h>
        #include <string.h>
        #include <sys/types.h>
        #include <netinet/in.h>
        #include <sys/socket.h>
        #include <errno.h>
        #include <stdlib.h>
        #include <arpa/inet.h>
        int main(int argc, char **argv)
        {
        struct sockaddr_in s_addr;
        int sock;
        int addr_len;
        int len;
        char buff[128];

/* 創建 socket , 關鍵在于這個 SOCK_DGRAM */
        if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        perror("socket");
        exit(errno);
        } else
        printf("create socket.\n\r");

/* 設置對方地址和端口信息 */
        s_addr.sin_family = AF_INET;
        if (argv[2])
        s_addr.sin_port = htons(atoi(argv[2]));
        else
        s_addr.sin_port = htons(7838);
        if (argv[1])
        s_addr.sin_addr.s_addr = inet_addr(argv[1]);
        else {
        printf("消息必須有一個接收者!\n");
        exit(0);
        }

/* 發送UDP消息 */
        addr_len = sizeof(s_addr);
        strcpy(buff, "hello i'm here");
        len = sendto(sock, buff, strlen(buff), 0, (struct sockaddr *) &s_addr, addr_len);
        if (len < 0) {
        printf("\n\rsend error.\n\r");
        return 3;
        }

printf("send success.\n\r");
        return 0;
        }

編譯程序用下列命令:

gcc -Wall simple-udpserver.c -o server
        gcc -Wall simple-udpclient.c -o client

 運行程序用下列命令:

./server 127.0.0.1 7838 啟動服務器
        ./client 127.0.0.1 7838 啟動客戶端

這樣就可以進行通訊。

UDP相關文章推薦:

TCP和UDP網絡通訊的區別及實現方式

基于Socket的UDP和TCP編程介紹

發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
主站蜘蛛池模板: 扒开粉嫩的小缝喷白浆h | 国产成本人片无码免费 | 伊人久久大香线蕉综合AV | 无码中文资源在线播放 | 欧美性猛交XXXX | 亚洲中文久久精品无码照片 | JAVAPARSERHD高潮 | 国产精品毛片av一区 | 真实乱子伦露脸自拍 | 视频一区国产 | 成人黄网站A片免费观看 | 五月婷久久综合狠狠爱97 | 亚洲欧美一级黄色录像视频 | 九九线精品视频在线观看 | 国产精品久久午夜夜伦鲁鲁简爱 | 水蜜桃AV无码一区二区 | 99国产欧美久久久精品蜜芽 | 久久伊人色AV天堂九九小黄鸭 | 一区二区三区免费看A片 | 人妻另类 专区 欧美 制服 | 亚洲精品色在线网站 | 很很鲁很很很鲁在线视频播放 | 嫩草网站入口一区二区 | 国产三级爽死你久久精品 | 女人在厨房被添高潮全过程A片 | 亚洲鲁丝片一区二区三区 | 爆乳喷奶水无码正在播放 | 小尤奈无码视频 | 国产妇女馒头高清泬20P多 | 无码区a毛片免费视频 | 国产偷窥熟妇高潮呻吟 | 97夜夜澡人人爽人人 | 亚洲AV无码乱码忘忧草亚洲人 | 在线观看热码亚洲av每日更新 | 在线观看日本黄色片 | 日韩人妻无码一区二区三区久久 | 免费又黄又硬又爽大片 | 国产爆乳美女娇喘呻吟 | 欧美VIDEOS巨大HD | 精品国产亚洲AV麻豆 | 亚洲精品无码高潮喷水A片小说 |