色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux下網絡編程-UDP協議探測在線好友

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2022-08-14 09:23 ? 次閱讀

1. UDP協議介紹

UDP協議 相對TCP協議來講屬于不可靠協議,UDP協議是廣播方式發送數據,沒有服務器和客戶端的概念。

Linux下使用socket創建UDP的套接字時,屬性要選擇數據報類型SOCK_DGRAM

 sockfd=socket(AF_INET,SOCK_DGRAM,0);
復制代碼

2. UDP協議發送和接收數據的函數

2.1 recvfrom函數

UDP使用recvfrom()函數接收數據,他類似于標準的read(),但是在recvfrom()函數中要指明數據的目的地址。

#include  
#include  
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr * from, size_t *addrlen);
復制代碼

返回值

成功返回接收到數據的長度,負數失敗

前三個參數等同于函數read()的前三個參數,flags參數是傳輸控制標志。最后兩個參數類似于accept的最后兩個參數(接收客戶端的IP地址)。

2.2 sendto函數

UDP使用sendto()函數發送數據,他類似于標準的write(),但是在sendto()函數中要指明目的地址。

#include  
#include  
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr * to, int addrlen);
復制代碼

返回值

成功返回發送數據的長度,失敗返回-1

前三個參數等同于函數read()的前三個參數,flags參數是傳輸控制標志。

參數to指明數據將發往的協議地址,他的大小由addrlen參數來指定。

2.3 設置套接字屬性

#include      /* See NOTES */
#include 
int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
復制代碼

setsockopt()函數用于任意類型、任意狀態套接口的設置選項值。盡管在不同協議層上存在選項,但本函數僅定義了最高的“套接口”層次上的選項。選項影響套接口的操作,諸如加急數據是否在普通數據流中接收,廣播數據是否可以從套接口發送等等。

參數介紹:

sockfd:標識一個套接口的描述字。
level:選項定義的層次;目前僅支持SOL_SOCKET和IPPROTO_TCP層次。
optname:需設置的選項。
optval:指針,指向存放選項值的緩沖區。
optlen:optval緩沖區的長度。
UDP協議發送數據時,設置具有廣播特性: 默認情況下socket不支持廣播特性
char bBroadcast=1;
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(char));
復制代碼

3.案例: UDP協議完成數據收發

3.1 接收數據示例

#include 
#include           /* See NOTES */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
/* According to POSIX.1-2001 */
#include 

int main(int argc,char **argv)
{
    if(argc!=2)
    {
        printf("參數: ./tcp_server <端口號>\n");
        return 0;
    }

     /*1. 創建socket套接字*/
    int sockfd;
    sockfd=socket(AF_INET,SOCK_DGRAM,0);
    if(sockfd<0)
    {
        printf("服務器:套接字創建失敗.\n");
        return 0;
    }
    /*2. 綁定端口號*/
    struct sockaddr_in addr;
    addr.sin_family=AF_INET; //IPV4
    addr.sin_port=htons(atoi(argv[1])); //65535
    //addr.sin_addr.s_addr=inet_addr("192.168.2.16");
    addr.sin_addr.s_addr=INADDR_ANY; //本地所有IP地址 "0.0.0.0"
    if(bind(sockfd,(const struct sockaddr *)&addr,sizeof(struct sockaddr)))
    {
        printf("服務器:端口號綁定失敗.\n");
        return 0;
    }
    /*3. 接收數據*/
    char buff[100];
    struct sockaddr_in from;
    size_t addrlen=sizeof(struct sockaddr);
    ssize_t len;
    while(1)
    {
        //帶阻塞功能,收到數據才會返回
        len=recvfrom(sockfd,buff,sizeof(buff)-1,0,(struct sockaddr*)&from,&addrlen);
        buff[len]='\0';
        printf("接收到數據:%s,長度=%d,數據來自于:%s:%d\n",buff,len,inet_ntoa(from.sin_addr),ntohs(from.sin_port));
    }
}
復制代碼

3.2 發送數據示例

#include 
#include           /* See NOTES */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
/* According to POSIX.1-2001 */
#include 
#include 

int main(int argc,char **argv)
{
     if(argc!=4)
    {
        printf("參數: ./tcp_client  <端口號> <發送的數據>\n");
        return 0;
    }

    /*1. 創建socket套接字*/
    int sockfd;
    sockfd=socket(AF_INET,SOCK_DGRAM,0);
    if(sockfd<0)
    {
        printf("服務器:套接字創建失敗.\n");
        return 0;
    }

    const int opt = 1;
    //設置該套接字為廣播類型,
    int nb = 0;
    nb = setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));
    if(nb == -1)
    {
        printf("設置廣播類型錯誤.\n");
    }

    /*2. 開始發送數據*/
    struct sockaddr_in addr;
    addr.sin_family=AF_INET; //IPV4
    addr.sin_port=htons(atoi(argv[2])); //65535  服務器的端口號
    addr.sin_addr.s_addr=inet_addr(argv[1]); //服務器IP地址

    ssize_t len;
    while(1)
    {
        len=sendto(sockfd,argv[3],strlen(argv[3]),0,(const struct sockaddr*)&addr,sizeof(struct sockaddr));
        printf("成功發送:%d\n",len);
        sleep(1);
    }
}
復制代碼地址>

4. 案例: 使用UDP協議探測在線好友

前面幾篇文章介紹了Linux下TCP協議設計的群聊天室的一個程序,如果想要知道同一個網絡下有多少好友在線,就可以使用UDP協議進行廣播探測。 大家的端口號是固定的,也就是只要在這個網絡范圍內,大家都跑這個同一個聊天室程序,就可以互相探測,得到對方IP地址之后,再完成TCP協議建立,完成點對點聊天通信

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
?
?
#define SEND_MSG "1314520"  //發送的數據包
#define PORT 8888      //固定的端口號
?
int sockfd;
int main(int argc,char **argv)
{  
  if(argc!=2)
   {
    printf("./app <廣播地址>  當前程序固定的端口號是8888\n");
    return 0;
   }

  /*1. 創建socket套接字*/
  sockfd=socket(AF_INET,SOCK_DGRAM,0);

  //設置端口號的復用功能
  int on = 1;
  setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

  /*2. 綁定端口號與IP地址*/
  struct sockaddr_in addr;
  addr.sin_family=AF_INET;
  addr.sin_port=htons(PORT); // 端口號0~65535
  addr.sin_addr.s_addr=INADDR_ANY;  //inet_addr("0.0.0.0"); //IP地址
  if(bind(sockfd,(const struct sockaddr *)&addr,sizeof(struct sockaddr))!=0)
   {
    printf("UDP服務器:端口號綁定失敗.\n");
    return 0;
   }
  /*3. 接收數據*/
  unsigned char buff[1024+1];
  int cnt;
  struct sockaddr_in client_addr;
  socklen_t addrlen=sizeof(struct sockaddr_in);

  struct pollfd fds;
  fds.fd=sockfd;
  fds.events=POLLIN;
  while(1)
   {
    cnt=poll(&fds,1,1000);
    if(cnt>0)
     {
      cnt=recvfrom(sockfd,buff,1024,0,(struct sockaddr *)&client_addr,&addrlen);
      buff[cnt]='\0';
      
      //判斷是不是探測包數據
      if(strcmp(buff,SEND_MSG)==0)
       {
        printf("在線好友:%s,%d-->%s:%d\n",buff,cnt,inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
        cnt=sendto(sockfd,SEND_MSG,strlen(SEND_MSG),0,(const struct sockaddr *)&client_addr,sizeof(struct sockaddr));
        printf("回應探測包:%d字節.\n",cnt);
?
        //這里可以繼續寫代碼,將存在的好友保存在鏈表,并記錄在線好友數量
       }
     }
    else
     {
      ssize_t cnt;
      struct sockaddr_in addr;
      addr.sin_family=AF_INET;
      addr.sin_port=htons(PORT); // 端口號0~65535
      addr.sin_addr.s_addr=inet_addr(argv[1]); //IP地址
?
      cnt=sendto(sockfd,SEND_MSG,strlen(SEND_MSG),0,(const struct sockaddr *)&addr,sizeof(struct sockaddr));
      printf("探測包發送:%d字節.\n",cnt);
     }
   }
  return 0;
}

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11292

    瀏覽量

    209334
  • UDP
    UDP
    +關注

    關注

    0

    文章

    325

    瀏覽量

    33931
  • 網絡編碼
    +關注

    關注

    0

    文章

    38

    瀏覽量

    11599
收藏 人收藏

    評論

    相關推薦

    UDP網絡編程

    UDP 是User Datagram Protocol的簡稱, 中文名是用戶數據報協議,是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無連接的傳輸
    的頭像 發表于 08-26 20:58 ?1417次閱讀
    <b class='flag-5'>UDP</b><b class='flag-5'>網絡</b><b class='flag-5'>編程</b>

    基于UDP協議網絡通信應用程序

    基于UDP協議網絡通信應用程序(UDP-Socket)前兩篇文章介紹了基于TCP/IP協議網絡
    發表于 11-05 08:29

    基于UDP協議的Socket網絡編程模式的實現

    傳輸層進行網絡通信編程的接口是Socket&它是通用的開發網絡通信程序標準) 本文介紹了基于UDP協議Socket
    發表于 09-09 15:10 ?42次下載

    Linux下的UDP協議編程

    Linux下的UDP協議編程 介紹UDP協議,并提供一個適用于客戶端和服務器端的實例子程序。 
    發表于 10-16 22:22 ?3974次閱讀
    <b class='flag-5'>Linux</b>下的<b class='flag-5'>UDP</b><b class='flag-5'>協議</b><b class='flag-5'>編程</b>

    UDP協議,UDP協議是什么意思

    UDP協議,UDP協議是什么意思 UDP 是User Datagram Protocol的簡稱, 中文名是用戶數據包
    發表于 03-29 17:35 ?1492次閱讀

    linux下網卡配置詳解

    linux下網卡配置詳解
    發表于 12-15 22:38 ?0次下載

    udp協議詳細介紹與qudpsocket編程

    關于udp協議詳細介紹與qudpsocket編程UDP報頭由4個域組成,其中每個域各占用2個字節,具體如下: 端口號 ,目標端口號 ,數據報長度 ,校驗值
    發表于 12-08 14:57 ?9274次閱讀
    <b class='flag-5'>udp</b><b class='flag-5'>協議</b>詳細介紹與qudpsocket<b class='flag-5'>編程</b>

    Linux下網絡怎樣來配置總結

    Linux下網絡配置總結
    發表于 11-07 11:35 ?898次閱讀

    Linux下網絡編程TCP并發服務器和TCP客戶端程序免費下載

    本文檔的主要內容詳細介紹的是Linux下網絡編程TCP并發服務器和TCP客戶端程序免費下載
    發表于 01-08 15:12 ?9次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>下網絡</b><b class='flag-5'>編程</b>TCP并發服務器和TCP客戶端程序免費下載

    tcp和udp協議的異同

    UDP 校驗和則是包含 UDP 首部和數據在內的校驗結果。 TCP協議 TCP協議基于網絡層的 IP
    的頭像 發表于 11-12 14:45 ?4070次閱讀
    tcp和<b class='flag-5'>udp</b><b class='flag-5'>協議</b>的異同

    嵌入式Linux應用程序開發-(9)UDP網絡通信應用程序(UDP-Socket)

    基于UDP協議網絡通信應用程序(UDP-Socket)前兩篇文章介紹了基于TCP/IP協議網絡
    發表于 11-02 12:21 ?35次下載
    嵌入式<b class='flag-5'>Linux</b>應用程序開發-(9)<b class='flag-5'>UDP</b><b class='flag-5'>網絡</b>通信應用程序(<b class='flag-5'>UDP</b>-Socket)

    Linux應用開發【第六章】網絡編程應用開發

    文章目錄 6 網絡編程應用開發 6.1 網絡編程簡介 6.1.1 五層因特網協議棧 6.1.2 傳輸層和應用層的常見
    的頭像 發表于 12-10 19:17 ?547次閱讀
    <b class='flag-5'>Linux</b>應用開發【第六章】<b class='flag-5'>網絡</b><b class='flag-5'>編程</b>應用開發

    Linux編程UDP SOCKET攻略詳解

    一、基本的udp socket編程 1. UDP編程框架 要使用UDP協議進行程序開發,我們必須
    的頭像 發表于 05-21 16:23 ?2195次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>編程</b>之<b class='flag-5'>UDP</b> SOCKET攻略詳解

    Linux下網絡編程

    TCP/IP協議源于1969年,是針對Internet開發的一種體系結構和協議標準,目的在于解決異種計算機網絡的通信問題。使得網絡在互聯時能為用戶提供一種通用、一致的通信服務。是Int
    的頭像 發表于 08-26 20:53 ?1141次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下網絡</b><b class='flag-5'>編程</b>

    Linux開發_網絡編程網絡通信介紹

    介紹Linux網絡編程: TCP網絡編程UDP網絡
    的頭像 發表于 09-17 15:46 ?1276次閱讀
    <b class='flag-5'>Linux</b>開發_<b class='flag-5'>網絡</b><b class='flag-5'>編程</b>、<b class='flag-5'>網絡</b>通信介紹
    主站蜘蛛池模板: 亚洲成AV人片一区二区不卡| 秘密影院久久综合亚洲综合| free性中国hd护士高清| 小sao货水好多真紧h的视频| 美女挑战50厘米长的黑人 | 快穿之诱受双性被灌满h| 大稥焦伊人一本dao| 中文字幕蜜臀AV熟女人妻| 三级中国免费的| 蜜桃传媒在线播放| 国产野外无码理论片在线观看| hdsex老太婆70| 伊人久久大香线蕉综合bd高清| 神马影院在线eecss伦理片| 裸妇厨房风流在线观看| 国产在线精彩视频| 高肉黄暴NP文公交车| 99久久精品费精品国产一区二| 亚洲精品成人a在线观看| 日日噜噜噜夜夜爽爽狠狠| 免费高清毛片| 久久国产精品福利影集| 国产欧美日韩亚洲第一页| 成人国产亚洲精品A区天堂蜜臀| 中文字幕乱码一区久久麻豆樱花| 国产福利一区二区精品| adc我们的永久网址| 13一18TV处流血TV| 一区二区不卡在线视频| 亚洲国产精品无码中文在线| 天天狠狠弄夜夜狠狠躁·太爽了| 女人一级毛片免费观看| 免费播放美女一级毛片| 玖玖爱精品视频| 久久久久久九九| 久久视热频这里只精品| 久久久久国产一级毛片高清片| 精品欧美一区二区三区久久久| 国产午夜精品理论片| 国产精品看高国产精品不卡| 高潮久久久久久久久不卡|