UDP也是传输层协议,它是无连接的,不可靠的传输服务.当接收数据时它不向发送方提供确认信息,它不提供输入包的顺序,如果出现丢失包或重份包的情况,也不会向发送方发出差错报文.由于它执行功能时具有较低的开销,因而执行速度比TCP快。
基于UDP服务器:
1.创建一个socket,用函数socket()
2.绑定IP地址、端口等信息到socket上,用函数bind()
3.循环接收数据,用函数recvfrom()
4.关闭网络连接。
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include<stdlib.h>
#include<pthread.h>
#define PORT 8000 //端口号
int main()
{
int sockfd;
char buf[32]={0};
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
sockfd=socket(PF_INET,SOCK_DGRAM,0);
if(-1==sockfd)
{
perror("socket");
exit(1);
}
memset(&server_addr,0,sizeof(server_addr));//初始化server_addr
server_addr.sin_family=PF_INET;//PF_INET 地址族
server_addr.sin_port= PORT; //端口号
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); //127.0.0.1为本机回环地址
int length=sizeof(server_addr);
int ret=bind(sockfd,(struct sockaddr *)&server_addr,length);
if(-1==ret) //如果绑定失败
{
perror("bind");
exit(1);
}
while(1)
{
length=sizeof(client_addr);
ret=recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&client_addr,&length);
if(-1==ret) //如果接收失败
{
perror("recvfrom");
exit(1);
}
printf("recv %s from %d \n",buf,client_addr.sin_port);
memset(buf,0,sizeof(buf)); //清空buf里的内容
}
return 0;
}
基于UDP客户端
1.创建一个socket,用函数socket()
2.绑定IP地址、端口等信息到socket上,用函数bind()
3.设置对方的IP地址和端口等属性
4.发送数据,用函数sendto()
5.关闭网络连接
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include<stdlib.h>
#include<pthread.h>
#define PORT 8000 //端口号
int main()
{
int ret;
char buf[32]={0};
struct sockaddr_in server_addr;
int sockfd=socket(PF_INET,SOCK_DGRAM,0);
if(-1==sockfd) //如果socket创建失败
{
perror("socket");
exit(1);
}
server_addr.sin_family=PF_INET;//PF_INET 地址族
server_addr.sin_port= PORT; //端口号
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); //127.0.0.1为本机回环地址
while(1)
{
memset(buf,0,sizeof(buf)); //初始化buf
scanf("%s",buf);
ret=sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&server_addr,sizeof(server_addr));
if(-1==ret) //如果发送失败
{
perror("sendto");
}
}
return 0;
}
运行结果: