UDP是一种无连接的、不可靠的数据报服务。
服务器(被动)
int socket ();//第二个参数选用SOCK_DGRAM
int bind ();//作为服务器,必须将地址信息和sockfd进行绑定
int recvfrom (); //接收任意一个客户端的数据
int sendto (); //给一个客户端发送数据
int close();
客户端(主动)
int socket ();
int sendto ();
int recvfrom ();
int close();
所涉及到的系统调用用法
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
其余系统调用与TCP协议网络编程流程(博客中有写过)中的一样。
例子
服务器端:
#include
#include
#include
#include
#include
#include
#include
#include
int main()
{
int sockfd=socket(AF_INET,SOCK_DGRAM,0);
assert(sockfd!=-1);
struct sockaddr_in ser_addr;
memset(&ser_addr,0,sizeof(ser_addr));
ser_addr.sin_family=AF_INET;
ser_addr.sin_port=htons(6000);
ser_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
int res=bind(sockfd,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
assert(res!=-1);
while(1)
{
char buff[128]={0};
struct sockaddr_in cli_addr;
int len=sizeof(cli_addr);
int n=recvfrom(sockfd,buff,127,0,(struct sockaddr*)&cli_addr,&len);
if(n<=0)
{
printf("recvfrom error\n");
continue;
}
printf("%s:%d-->%s\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.si n_port),buff);
int res=sendto(sockfd,"ok",2,0,(struct sockaddr*)&cli_addr,len);
if(res<=0)
{
printf("sendto error\n");
continue;
}
}
close(sockfd);
exit(0);
}
客户端:
#include
#include
#include
#include
#include
#include
#include
#include
int main()
{
int sockfd=socket(AF_INET,SOCK_DGRAM,0);
assert(sockfd!=-1);
struct sockaddr_in ser_addr;
memset(&ser_addr,0,sizeof(ser_addr));
ser_addr.sin_family=AF_INET;
ser_addr.sin_port=htons(6000);
ser_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
while(1)
{
printf("input: ");
char buff[128]={0};
fgets(buff,127,stdin);
if(strncmp(buff,"end",3)==0)
{
break;
}
int res=sendto(sockfd,buff,strlen(buff)-1,0,(struct sockaddr*)&ser_a ddr,sizeof(ser_addr));
assert(res!=-1);
memset(buff,0,128);
int n=recvfrom(sockfd,buff,127,0,NULL,NULL);
assert(n!=-1);
printf("recvfrom data :%s\n",buff);
}
close(sockfd);
exit(0);
}
运行结果如下:
特点
一次sendto对应一次recvfrom
接收方一次recvfrom如果没有将一次sendto发送的数据接收完,则剩余的数据就会被丢弃。