【linux c】簡單UDP應用,資料傳送與接收
阿新 • • 發佈:2019-01-01
主要函式:
接收recvfrom()
ssize_t recvfrom (int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
引數說明:
sockfd:套接字
buf:用於接收資料的buffer
len:長度,接收資料的最大長度
flags:一般設定為0
src_addr:傳送源的地址
addrlen:sizeof(src_addr)
注意:假如套接字上沒有訊息可以讀取,且套接字沒有設定為非阻塞模式(預設為阻塞模式),recvfrom會一直阻塞等待訊息的到來。
傳送sendto()
ssize_t sendto (int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
引數說明:
sockfd:套接字
buf:要傳送的資料buffer
len:要傳送資料長度
flags:一般為0
dest_addr:傳送目的地地址,IP和埠號
addrlen:sizeof(dest_addr)
直接上程式碼
傳送端:
#include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/types.h> #include <unistd.h> #include <strings.h> #include <dirent.h> #include <sys/stat.h> #include <fcntl.h> int main() { //建立一個套結字 int lfd,ret; lfd = socket(AF_INET,SOCK_DGRAM,0); //封裝套結字地址結構 struct sockaddr_in saddr,caddr; caddr.sin_family = AF_INET; caddr.sin_port = htons(5555); caddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //繫結套結字地址到套結字描述字 ret = bind(lfd,(struct sockaddr*)&caddr,sizeof(caddr)); if(ret < 0) { perror("bind fail:"); return -1; } //封裝套結字地址結構 saddr.sin_family = AF_INET; saddr.sin_port = htons(4444); saddr.sin_addr.s_addr = inet_addr("127.0.0.1"); char buf[1024]="test udp protcol !"; int addrlen; while(1) { /*一直向saddr的地址(接收端IP和埠號),傳送udp包*/ sendto(lfd,buf,1024,0,(struct sockaddr*)&saddr,sizeof(saddr)); sleep(3); } close(lfd); return 0; }
接收端:
#include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/types.h> #include <unistd.h> #include <strings.h> #include <dirent.h> #include <sys/stat.h> #include <fcntl.h> int main() { //建立一個套結字 int lfd,ret; lfd = socket(AF_INET,SOCK_DGRAM,0); //封裝套結字地址結構 struct sockaddr_in saddr,caddr; saddr.sin_family = AF_INET; /*接收端埠號*/ saddr.sin_port = htons(4444); /*接收端IP,此處設定為迴環地址*/ saddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //繫結套結字地址到套結字描述字 ret = bind(lfd,(struct sockaddr*)&saddr,sizeof(saddr)); if(ret < 0) { perror("bind fail:"); return -1; } char buf[1024]; int addrlen; while(1) { bzero(buf,sizeof(buf)); addrlen = sizeof(caddr); /*接收發送端傳送的資料*/ ret = recvfrom(lfd,buf,1024,0,(struct sockaddr*)&caddr,&addrlen); printf("%s\n",buf); sleep(2); } close(lfd); return 0; }