UDP协议
1、与TCP协议对比
相同:UDP协议与TCP协议一样,都是属于网络体系模型中传输层。
不同:UDP协议面向一种无连接方式,不可靠方式。 类似 现实例子: 寄信
2、 UDP协议的工作流程
服务器: 只需要创建套接字socket与绑定地址bind,不需要设置监听listen与接收accept。
客户端: 只需要创建套接字socket,不需要连接connect。
在UDP协议中,不能使用send()与recv(),只能使用sendto()与recvfrom()。
服务器:
int main(int argc,char *argv[]) // ./server 50002
{
//1. 创建一个UDP协议的套接字
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
//2. 绑定地址
struct sockaddr_in srvaddr,cliaddr;
socklen_t len = sizeof(srvaddr);
bzero(&srvaddr,len);
bzero(&cliaddr,len);
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(atoi(argv[1]));
srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sockfd,(struct sockaddr *)&srvaddr,len);
//3. 等待对方给自己发来消息
char buf[50];
while(1)
{
bzero(buf,50);
recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&cliaddr,&len);
printf("from %s client:%s",(char *)inet_ntoa(cliaddr.sin_addr),buf);
if(strncmp(buf,"quit",4) == 0)
break;
}
//4. 销毁信箱
close(sockfd);
return 0;
}
客户端:
int main(int argc,char *argv[]) // ./client 192.168.12.8 50002
{
//1. 创建一个UDP协议的套接字
int sockfd = socket(AF_INET,SOCK_DGRAM,0); //sockfd是UDP套接字
//2. 准备对方的地址
struct sockaddr_in srvaddr;
socklen_t len = sizeof(srvaddr);
bzero(&srvaddr,len);
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(atoi(argv[2]));
inet_pton(AF_INET,argv[1],&srvaddr.sin_addr);
//3. 直接写信
char buf[50];
while(1)
{
bzero(buf,50);
fgets(buf,50,stdin);
sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&srvaddr,len);
if(strncmp(buf,"quit",4) == 0)
break;
}
//4.销毁
close(sockfd);
return 0;
}