UDP介绍
UDP — ⽤户数据报协议,是⼀个⽆连接的简单的⾯向数据报的运输层协 议。UDP不提供可靠性,它只是把应⽤程序传给IP层的数据报发送出去,但是并不能保证它们能到达⽬的地。由于UDP在传输数据报前不⽤在客户和服 务器之间建⽴⼀个连接,且没有超时重发等机制,故⽽传输速度很快。
UDP是⼀种⾯向⽆连接的协议,每个数据报都是⼀个独⽴的信息,包括完整 的源地址或⽬的地址,它在⽹络上以任何可能的路径传往⽬的地,因此能否 到达⽬的地,到达⽬的地的时间以及内容的正确性都是不能被保证的。
1 send端
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
struct sockaddr_in s_addr;//结构体
int sock;
int addr_len;//获取结构长度
int len;
char buff[128];
int yes;
if (argc != 2)
{
printf(“Please input %s IP\n”,argv[1]);
}
if(-1 == (sock = socket(AF_INET, SOCK_DGRAM, 0))){ //以UDP方式创建socket 创建创建创建
perror(“socket”);
exit(EXIT_FAILURE);
}
else
cout<
yes = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)); //设置socket为可发送广播消息
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(7838);//指定接收广播消息的端口
if(argv[1]){
s_addr.sin_addr.s_addr = inet_addr(argv[1]); //argv[1] 为广播消息的目的地址,即广播地址
}
else{
printf(“input server IP!\n”);
exit(0);
}
addr_len = sizeof(s_addr);
strcpy(buff, “hello message”);
// while(1){
int i;
for(i=0; ; i++){
len = sendto(sock, buff, strlen(buff), 0, (struct sockaddr*)&s_addr, addr_len); //使用UDP广播的消息
if(len < 0){
printf(“\n\rsend error.\n\r”);
exit(EXIT_FAILURE);
}
//sleep(1);
printf(“send success %d:\tsend message is %s\n”,i,&buff);
}
return 0;
}
send端的CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.10)
project(UDP)
set(CMAKE_CXX_STANDARD 11)
add_executable(UDP main.cpp)
2 receive端
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXSIZE 128
int main(int argc, char* argv[])
{
struct sockaddr_in s_addr;
struct sockaddr_in c_addr; //发送端
int sock;
socklen_t addr_len;
int len;
char buff[MAXSIZE];
if(-1 == (sock = socket(AF_INET, SOCK_DGRAM, 0))){//以UDP方式创建socket 创建创建创建
perror(“socket”);
exit(EXIT_FAILURE);
}
else
printf(“create socket success\n”);
memset(&s_addr, 0 , sizeof(struct sockaddr_in));//将s_addr清空
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(7838);
s_addr.sin_addr.s_addr = INADDR_ANY; //指示接收的数据IP,必须为此值,因为是广播,接收地址任意
if(-1 == (bind(sock, (struct sockaddr*)&s_addr, sizeof(s_addr)))){
std::cout<
perror(“bind”);
exit(EXIT_FAILURE);
}
else{
printf(“bind address to socket.\n”);
}
addr_len = sizeof(c_addr);
while(1){
len = recvfrom(sock, buff,sizeof(buff)-1, 0, (struct sockaddr*)&c_addr, &addr_len);//从服务端接收数据
if(len < 0){
perror(“recvfrom failed…”);
exit(EXIT_FAILURE);
}
buff[len]= ‘\0’;
printf(“receive come from %s:%d message:%s\n”,inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port),buff);
}
return 0;
}
receive端的CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.5)
project(UDPreceive)
set(CMAKE_CXX_STANDARD 11)
add_executable(UDPreceive main.cpp)
3 测试
有两种测试方法,一是用网线连接两台电脑,一台执行发送端,另一台执行接受端。
二是在一台电脑上自发自收(需要将IP设定为127.0.0.1)。
这里演示第二种方法。编译完后在两个终端分别运行可执行文件:
发送端:
./UDP 127.0.0.1
接受端:
./UDPreceive
效果:
标签:UDP,addr,int,demo,struct,linux,include,socket
来源: https://blog.csdn.net/qq_43145072/article/details/96481235