日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux网络编程 之 UDP编程(六)

發布時間:2024/2/28 linux 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux网络编程 之 UDP编程(六) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄
1. UDP客戶端
????核心函數
????完整的UDP客戶端程序
2. UDP服務端
????核心函數
????完整的UDP客戶端程序
3. 總結


1. UDP客戶端

核心函數

ssize_t sendto(int sockfd,const void *buf,size_t nbytes,int flags,socklen_t addrlen );
  • sockfd:套接字
  • buf:發送數據緩沖區
  • nbytes:發送數據緩沖區的大小
  • flags:一般為 0
  • to:指向目的主機地址結構體的指針
  • addrlen:to 所指向內容的長度

完整的UDP客戶端程序

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int main(int argc, charchar *argv[]) { unsigned short port ;charchar *server_ip ;if( argc > 1 ) // main函數傳參,服務器ip地址 { server_ip = argv[1]; } if( argc > 2 ) // main函數傳參,服務器端口 { port = atoi(argv[2]); } int sockfd; sockfd = socket(AF_INET, SOCK_DGRAM, 0); //創建UDP套接字 if(sockfd < 0) { perror("socket"); exit(-1); } // 構造套接字地址 這個結構體有三個參數:套接字域,ip,portstruct sockaddr_in dest_addr; bzero(&dest_addr, sizeof(dest_addr)); // 清空內容 dest_addr.sin_family = AF_INET; // ipv4 dest_addr.sin_port = htons(port); // 端口轉換 inet_pton(AF_INET, server_ip, &dest_addr.sin_addr); // ip地址轉換 printf("send data to UDP server %s:%d!\n", server_ip, port); while(1) { char send_buf[512] = ""; fgets(send_buf, sizeof(send_buf), stdin);//獲取輸入 send_buf[strlen(send_buf)-1] = '\0'; //發送數據 int len = sendto(sockfd, send_buf, strlen(send_buf), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr)); printf("len = %d\n", len); } close(sockfd); return 0; }

2. UDP 服務端

核心函數:

接收端使用 bind() 函數,來完成地址結構與 socket 套接字的綁定,這樣 ip、port 就固定了

int bind( int sockfd,const struct sockaddr *myaddr,socklen_t addrlen );
  • sockfd: socket 套接字
  • myaddr: 服務端的地址結構指針
  • addrlen:該地址結構的長度

recvfrom方法接收 UDP 數據,并將源地址信息保存在 from 指向的結構中

ssize_t recvfrom( int sockfd, void *buf, size_t nbytes,int flags,struct sockaddr *from, socklen_t *addrlen );

參數的含義,可以參考UDP客戶頓的sendto方法:

完整的UDP服務端程序

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int main(int argc, charchar *argv[]) { unsigned short port ; // 本地端口 if(argc > 1) { port = atoi(argv[1]); } int sockfd; sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 創建套接字 if(sockfd < 0) { perror("socket"); exit(-1); } // 構造本地網絡地址的結構體 sockaddr_instruct sockaddr_in my_addr; bzero(&my_addr, sizeof(my_addr)); // 清空結構體內容 my_addr.sin_family = AF_INET; // ipv4 my_addr.sin_port = htons(port); // 端口轉換 my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 綁定網卡所有ip地址,INADDR_ANY為通配地址,值為0 printf("Binding server to port %d\n", port); int err_log; //將套接字綁定到本地網絡地址結構體上err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr)); if(err_log != 0) { perror("bind"); close(sockfd); exit(-1); } printf("receive data...\n"); while(1) { int recv_len; char recv_buf[512] = ""; struct sockaddr_in client_addr; char cli_ip[INET_ADDRSTRLEN] = "";//INET_ADDRSTRLEN=16 socklen_t cliaddr_len = sizeof(client_addr); // 接受數據 recv_len = recvfrom(sockfd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr*)&client_addr, &cliaddr_len); inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN); printf("\nip:%s ,port:%d\n",cli_ip, ntohs(client_addr.sin_port)); printf("data(%d):%s\n",recv_len,recv_buf); } close(sockfd); return 0; }

3. 總結

UDP服務端編程分5步:

  • 創建 UDP socket套接字,用socket函數。

  • 設置socket的屬性,用setsockopt()函數,(可選)

  • 往socket綁定包含 IP信息,地址信息的 struct sockaddr_in(IPv4)結構體。用bind()函數

  • 循環接收消息,用recvfrom()函數

  • 關閉socket套接字

  • UDP客戶端編程分:

  • 創建 UDP socket套接字,用socket函數。

  • 用sendto()函數往指定的IP,地址發送信息。

  • 總結

    以上是生活随笔為你收集整理的Linux网络编程 之 UDP编程(六)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。