国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

Hi,歡迎來到嵌入式培訓(xùn)高端品牌 - 華清遠(yuǎn)見教育科技集團(tuán)<北京總部官網(wǎng)>,專注嵌入式工程師培養(yǎng)15年!
當(dāng)前位置: > 華清遠(yuǎn)見教育科技集團(tuán) > 嵌入式學(xué)習(xí) > 講師博文 > UDP通訊方式及編程實(shí)現(xiàn)步驟
UDP通訊方式及編程實(shí)現(xiàn)步驟
時(shí)間:2017-01-04作者:華清遠(yuǎn)見

網(wǎng)絡(luò)編程的目的就是指直接或間接地通過網(wǎng)絡(luò)協(xié)議與其他計(jì)算機(jī)進(jìn)行通訊。目前較為流行的網(wǎng)絡(luò)編程模型是客戶機(jī)/服務(wù)器(Client/Server)結(jié)構(gòu),即通信雙方一方作為服務(wù)器等待客戶提出請(qǐng)求并予以響應(yīng),客戶則在需要服務(wù)時(shí)向服務(wù)器提出申請(qǐng)。服務(wù)器一般作為守護(hù)進(jìn)程始終運(yùn)行,監(jiān)聽網(wǎng)絡(luò)端口,一旦有客戶請(qǐng)求,就會(huì)啟動(dòng)一個(gè)服務(wù)進(jìn)程來響應(yīng)該客戶,同時(shí)自己繼續(xù)監(jiān)聽服務(wù)端口,使后來的客戶也能及時(shí)得到服務(wù)。

UDP協(xié)議是User Datagram Protocol的簡(jiǎn)稱,是一種無連接的協(xié)議,每個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的信息,包括完整的源地址或目的地址,它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因此能否到達(dá)目的地,到達(dá)目的地的時(shí)間以及內(nèi)容的正確性都是不能被保證的。

既然有了保證可靠傳輸?shù)腡CP協(xié)議,為什么還要非可靠傳輸?shù)腢DP協(xié)議呢?主要的原因有兩個(gè)。一是可靠的傳輸是要付出代價(jià)的,對(duì)數(shù)據(jù)內(nèi)容正確性的檢驗(yàn)必然占用計(jì)算機(jī)的處理時(shí)間和網(wǎng)絡(luò)的帶寬,因此TCP傳輸?shù)男什蝗鏤DP高。二是在許多應(yīng)用中并不需要保證嚴(yán)格的傳輸可靠性,比如視頻會(huì)議系統(tǒng),并不要求音頻視頻數(shù)據(jù)絕對(duì)的正確,只要保證連貫性就可以了,這種情況下顯然使用UDP會(huì)更合理一些。

UDP編程的服務(wù)器端一般步驟是:

1、創(chuàng)建一個(gè)socket,用函數(shù)socket();
        2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
        3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();
        4、循環(huán)接收數(shù)據(jù),用函數(shù)recvfrom();
        5、關(guān)閉網(wǎng)絡(luò)連接;

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

1、創(chuàng)建一個(gè)socket,用函數(shù)socket();
        2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
        3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();* 可選
        4、設(shè)置對(duì)方的IP地址和端口等屬性;
        5、發(fā)送數(shù)據(jù),用函數(shù)sendto();
        6、關(guān)閉網(wǎng)絡(luò)連接;

UDP通訊服務(wù)器端源代碼如下:

#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];

/* 創(chuàng)建 socket , 關(guān)鍵在于這個(gè) 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));
        /* 設(shè)置地址和端口信息 */
        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");

/* 循環(huán)接收數(shù)據(jù) */
        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];

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

/* 設(shè)置對(duì)方地址和端口信息 */
        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("消息必須有一個(gè)接收者!\n");
        exit(0);
        }

/* 發(fā)送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

 運(yùn)行程序用下列命令:

./server 127.0.0.1 7838 啟動(dòng)服務(wù)器
        ./client 127.0.0.1 7838 啟動(dòng)客戶端

這樣就可以進(jìn)行通訊。

UDP相關(guān)文章推薦:

TCP和UDP網(wǎng)絡(luò)通訊的區(qū)別及實(shí)現(xiàn)方式

基于Socket的UDP和TCP編程介紹

發(fā)表評(píng)論
評(píng)論列表(網(wǎng)友評(píng)論僅供網(wǎng)友表達(dá)個(gè)人看法,并不表明本站同意其觀點(diǎn)或證實(shí)其描述)