UDP的特点:
1.UDP是无连接的,通信是不需要创建连接。
2.UDP采用了最大努力交付,不保证可靠交付。
3.UDP是面向报文,无阻塞控制。
4.UDP支持一对一,一对多,多对一,多对多的交互通信。
UDP的编程框架
通过服务器和客户机端对UDP通信进行描述:
UDP服务器端编程:
1.创建socket,使用函数socket();
2.绑定端口号,IP地址,使用函数bind();
3.在循环里面接收数据,使用函数recvfrom();
4.关闭网络连接。
UDP客户端编程:
1.创建socket,使用socket();
2.绑定端口号,IP地址,使用函数bind();*可选
3.设置对方的IP地址和端口号等信息。
4.发送数据,使用函数sendto();
5.关闭网络连接。
代码实例:
/*server*/
#include<signal.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
struct sockaddr_in addr;
char r_buf[100];
char s_buf[100];
int len = sizeof(addr);
//创建socket描述符
int sock = socket(AF_INET,SOCK_DGRAM,0);
perror("socket");
addr.sin_family = AF_INET;
//填充端口号
addr.sin_port = htons(6789);
//填充IP地址
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
//绑定
bind(sock,(struct sockaddr *)&addr,len);
perror("bind");
while(1)
{
memset(r_buf,0,sizeof(r_buf));
//接收数据
recvfrom(sock,r_buf,sizeof(r_buf),0,(struct sockaddr *)&addr,&len);
printf("client: port = %d\n",ntohs(addr.sin_port));
printf("server: r_buf = %s\n",r_buf);
memset(s_buf,0,100);
printf("server: send\n");
fgets(s_buf,sizeof(s_buf),stdin);
//发送数据
sendto(sock,s_buf,sizeof(s_buf),0,(struct sockaddr *)&addr,len);
printf("server: send success\n");
}
return 0;
}
/*client*/
#include<signal.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
struct sockaddr_in addr;
char r_buf[100];
char s_buf[100];
int len = sizeof(addr);
//创建socket描述符
int sock = socket(AF_INET,SOCK_DGRAM,0);
perror("socket");
addr.sin_family = AF_INET;
//设置对方的端口号和IP地址
addr.sin_port = htons(6789);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
while(1)
{
memset(s_buf,0,100);
printf("server: send\n");
fgets(s_buf,sizeof(s_buf),stdin);
//发送数据
sendto(sock,s_buf,sizeof(s_buf),0,(struct sockaddr *)&addr,len);
printf("server: send success\n");
memset(r_buf,0,sizeof(r_buf));
//接收数据
recvfrom(sock,r_buf,sizeof(r_buf),0,(struct sockaddr *)&addr,&len);
printf("client: port = %d\n",ntohs(addr.sin_port));
printf("server: r_buf = %s\n",r_buf);
}
return 0;
}
测试结果:
客户机端
服务器端