最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux之UDP協(xié)議及其編程全流程

 更新時間:2023年03月23日 14:30:44   作者:Dutkig  
這篇文章主要介紹了Linux之UDP協(xié)議及其編程全流程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

UDP協(xié)議的特點

UDP 不提供可靠性的傳輸,它只是把應用程序傳給 IP 層的數(shù)據(jù)報發(fā)送出去,但是并不能保證它們能到達目的地。

由于 UDP 在傳輸數(shù)據(jù)報前不用在客戶和服務器之間建立一個連接,且沒有超時重發(fā)等機制,故而傳輸速度很快。

  • 無連接
  • 不可靠
  • 數(shù)據(jù)報服務

UDP發(fā)出的數(shù)據(jù)包不經過確認,可以繼續(xù)發(fā)送。發(fā)送成功與否都不管,盡最大能力去發(fā)送,丟包也不負責。有自己的使用特點:適合于做視頻(實時性)適合于即使丟包了,處理起來也比較方便。

適合于攝像頭以恒定速率發(fā),對方以恒定速率收,丟包了繼續(xù)發(fā),可以實時。

但是如果是TCP,如果丟包,會重發(fā),時間花銷大了,不能實時。不適合做攝像頭和視頻。

UDP的編程流程

UDP接口原型

接收

int recvfrom(int sockfd,void *buf,size_t size,int flag,struct sockaddr *peer_addr,socklen_t *addr_len);
  • peer_addr:用來保存recvfrom接收到的數(shù)據(jù)是來自哪臺主機的地址信息
  • addr_len:地址結構的長度

發(fā)送

int sendto(int sockfd,void *buf,size_t size,int flag,struct sockaddr *peer_addr,socklen_t addr_len);
  • peer_addr:用來指定數(shù)據(jù)的接收方的地址信息
  • addr_len:地址信息的長度

示例代碼

UDP服務器端

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<unistd.h>

#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<netinet/in.h>

int main()
{
    //SOCK_DGRAM表示使用的是UDP協(xié)議
    int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    assert(sockfd != -1);

    struct sockaddr_in ser_addr;
    memset(&ser_addr,0,sizeof(ser_addr));
    ser_addr.sin_family = AF_INET;
    //將主機字節(jié)序轉化為網絡字節(jié)序
    ser_addr.sin_port = htons(6000);
    //將點分十進制的地址字符串轉為unit32類型的值
    ser_addr.sin_addr.s_addr = inet_addr("192.168.246.128");

    int res = bind(sockfd,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
    assert(res != -1);

    //循環(huán)接受不同客戶端的數(shù)據(jù)
    while(1)
    {
        char buff[128] = {0};

        struct sockaddr_in cli_addr;
        socklen_t cli_len = sizeof(cli_addr);
        int n = recvfrom(sockfd,buff,127,0,(struct sockaddr*)&cli_addr,&cli_len);
        if(n <= 0)
        {
            break;            
        }

        printf("%s:%d -- %s\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port),buff);   
     
        n = sendto(sockfd,"OK",2,0,(struct sockaddr*)&cli_addr,cli_len);
        if(n <= 0)
        {
            break;
        }
    }

    close(sockfd);
    exit(0);
}

UDP客戶端

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<unistd.h>

#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<netinet/in.h>

int main()
{
    int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    assert(sockfd != -1);

    struct sockaddr_in ser_addr;
    memset(&ser_addr,0,sizeof(ser_addr));
    ser_addr.sin_family = AF_INET;
    ser_addr.sin_port = htons(6000); 
    ser_addr.sin_addr.s_addr = inet_addr("192.168.246.128");

    while(1)
    {
        printf("請輸入:");
        char buff[128] = {0};
        fgets(buff,127,stdin);

        if(strncmp(buff,"end",3) == 0)
        {
            break;
        }

        int n = sendto(sockfd,buff,strlen(buff),0,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
        if(n <= 0)
        {
            break;
        }

        memset(buff,0,128);

        int m = recvfrom(sockfd,buff,127,0,NULL,NULL);//服務器地址信息已知,無需保存直接傳入NULL
        if(m <= 0)
        {
            break;
        }
        printf("%s\n",buff);
    }   

    close(sockfd); 

    exit(0);
}

兩個客戶端同時向服務器端發(fā)送信息

多個客戶端可以和服務器一起鏈接通訊。recvfrom并不是只等第一個或者第二個客戶端,而是誰給它發(fā),它就收誰的。

如果在客戶端保持運行狀態(tài)的情況下,將服務器端關閉,然后再把服務器端重新運行起來,這時候客戶端發(fā)送數(shù)據(jù),服務器端是可以收到的。

因為UDP本來就沒有建立連接。如果服務器端關了,客戶端send就失敗了。 數(shù)據(jù)包丟了就丟了,不會理會。不管關閉哪一端,對方端都不知道這件事情,彼此無關系,無影響。

如果讓服務器端一次只接受一個字符,我給你發(fā)一個數(shù)據(jù)包,你去收這個數(shù)據(jù)包,你recvfrom,你把這個數(shù)據(jù)包拆開,你讀取1個字符,后面的不讀,直接就丟掉了。

UDP的報頭結構

 

UDP的報頭固定是8個字節(jié)!

  • UDP的報文段長度 – 表示這個UDP報文段的報頭+數(shù)據(jù)部分的總長度 一個UDP報文段數(shù)據(jù)部分的長度為總長度 - 8
  • 冗余檢驗碼 – 會對整個UDP數(shù)據(jù)報進行冗余校驗

UDP的優(yōu)勢

  • 沒有確認機制和超時重傳機制,發(fā)送方發(fā)送報文段的效率就很高。
  • 頭部固定部分比較小,一個UDP報文段所攜帶的上次協(xié)議的數(shù)據(jù)就比TCP多一點。
  • UDP的實現(xiàn)相對比較簡單。

UDP的數(shù)據(jù)報服務

  • sendto和recvfrom的次數(shù)是一一對應的。
  • sendto一次,底層就發(fā)送一個UDP報文段,對方就接受這一個UDP報文段。
  • 如果一次recvfrom沒有將一個UDP報文段中的數(shù)據(jù)讀取完成,則剩余的數(shù)據(jù)會被丟棄。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Linux中Centos7搭建Hadoop服務步驟

    Linux中Centos7搭建Hadoop服務步驟

    本篇文章給大家詳細講述了Linux中Centos7搭建Hadoop服務步驟,對此有需要的讀者朋友們可以參考下。
    2018-02-02
  • Linux如何使用 MyCat 實現(xiàn) MySQL 主從讀寫分離

    Linux如何使用 MyCat 實現(xiàn) MySQL 主從讀寫分離

    這篇文章主要介紹了Linux如何 MyCat 實現(xiàn) MySQL 主從讀寫分離,感興趣并且想詳情了解的小伙伴接著看下文吧
    2021-08-08
  • Linux修改用戶所屬組的方法

    Linux修改用戶所屬組的方法

    在本篇文章里小編給大家整理的是關于Linux修改用戶所屬組的方法,有需要的朋友們參考下。
    2020-02-02
  • Linux chkconfig 命令的使用

    Linux chkconfig 命令的使用

    這篇文章主要介紹了Linux chkconfig 命令的使用,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-08-08
  • linux上TCP connection timeout問題解決辦法

    linux上TCP connection timeout問題解決辦法

    這篇文章主要介紹了 linux上TCP connection timeout問題解決辦法的相關資料,需要的朋友可以參考下
    2017-04-04
  • 詳解Linux重定向用法

    詳解Linux重定向用法

    這篇文章主要介紹了Linux重定向用法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • VMWare中CentOS ifcfg-eth0配置方法(親測直接可用)

    VMWare中CentOS ifcfg-eth0配置方法(親測直接可用)

    本篇文章主要介紹了VMWare中CentOS ifcfg-eth0配置,這些配置是基于VMware Network Adapter VMnet8,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • LNMP自動安裝部署腳本

    LNMP自動安裝部署腳本

    LNMP是一個基于CentOS/Debian編寫的Nginx、PHP、MySQL、phpMyAdmin、eAccelerator一鍵安裝包,這篇文章主要為大家分享了LNMP自動安裝部署腳本
    2016-10-10
  • CentOS系統(tǒng)下Apache配置多域名或多端口映射的方法

    CentOS系統(tǒng)下Apache配置多域名或多端口映射的方法

    我們大多情況是一臺服務器一個IP,這樣配置起來很簡單,但是如何想多域名多端口映射的話就沒那么簡單了,下面這篇文章主要介紹了CentOS系統(tǒng)下Apache配置多域名或多端口映射的方法,需要的朋友可以參考學習,下面來一起看看吧。
    2016-12-12
  • 詳解Linux如何將一個文件夾的所有內容授權給某一個用戶?

    詳解Linux如何將一個文件夾的所有內容授權給某一個用戶?

    這篇文章主要介紹了Linux如何將一個文件夾的所有內容授權給某一個用戶,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05

最新評論

元江| 左贡县| 民权县| 信丰县| 班戈县| 资溪县| 迭部县| 天台县| 德兴市| 如东县| 岱山县| 临沂市| 高青县| 团风县| 云南省| 怀远县| 屯昌县| 永兴县| 阳谷县| 无为县| 阳信县| 兴和县| 宜兰县| 都江堰市| 岐山县| 马公市| 松潘县| 宜春市| 莲花县| 罗田县| 肥城市| 龙泉市| 汉阴县| 山东省| 开鲁县| 雅江县| 宁波市| 青龙| 资溪县| 巴楚县| 荣成市|