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