主要函數:
接收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;
}