##简介
- 这次主要是介绍一下udp通信,并写一个UDP镜子服务器的简单应用。
udp是不面向连接的通信模式,通信双方并不需要知道对方的状态,就像你给某人写信,信从你手上发出后,如果对面不会,你就不知道信的状态了,不知道究竟到没到对方手上。
##模块介绍 - 直接上代码
##服务器的代码
//函数需要的一些头文件
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
int main(void)
{
int recv = 0;
int sendt;
//申请套接字,创建连接的节点
int fd = socket(AF_INET,SOCK_DGRAM,0);
if(fd == -1)
{
perror("socket");
return -1;
}
//创建地址结构体
struct sockaddr_in addr;
bzero(&addr,addrlen);
socklen_t addrlen = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);//设置服务器的ip地址为可用网卡地址之一
addr.sin_port = htons(5000);//设置通信端口号
//给节点绑定地址
int flag = bind(fd,(struct sockaddr *)&addr,addrlen);
if(flag != 0)
{
perror("bind");
return -1;
}
//创建缓存区接收客户端数据
char buff[1024];
bzero(buff,1024);
//准备一个结构体保存客户端的信息
struct sockaddr_in addr_client;
bzero(&addr_client,addrlen);
while(1)
{
bzero(buff,1024);
//循环接收来自客户端的数据,保存到buff中
recv = recvfrom(fd, buff,1024, 0 ,(struct sockaddr *)&addr_client,&addrlen);
if(recv == -1)
{
perror("recvfrom");
return -1;
}
//把收到的数据反弹给客户端
sendt = sendto(fd,buff,1024, 0,(struct sockaddr *)&addr_client, addrlen);
if(recv == -1)
{
perror("sendto");
return -1;
}
}
return 0;
}
##客户端的代码
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
int main(void)
{
ssize_t sendt;
int recv;
char buff[1024];
//创建套接字
int fd = socket(AF_INET,SOCK_DGRAM,0);
if(fd == -1)
{
perror("socket");
return -1;
}
//准备地址结构体
struct sockaddr_in addr;
socklen_t addrlen = sizeof(addr);
bzero(&addr,addrlen);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("192.168.1.3");//指向服务器ip地址,这里可根据本机ip地址不同而改变
addr.sin_port = htons(5000);//指定通信的端口
char buff[1024];
while(1)
{
bzero(buff,1024);
printf("请输入数据:\n");
fgets(buff,1024,stdin);
//向服务器发送消息
sendt = sendto(fd,buff,12, 0,(struct sockaddr *)&addr, addrlen);
if(sendt == -1)
{
perror("sendto");
return -1;
}
//从服务器接收消息
bzero(buff,1024);
recv = recvfrom(fd, buff,1024, 0 ,(struct sockaddr *)&addr,&addrlen);
if(recv == -1)
{
perror("recv");
return -1;
}
printf("from server:%s\n",buff);
}
return 0;
}