Linux网络编程 之 UDP编程(六)
生活随笔
收集整理的這篇文章主要介紹了
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编程(六)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux网络编程 之 广播(五)
- 下一篇: Linux网络编程 之 TCP编程(七)