【UDP通信】原理简介及编程实现

UDP介绍

UDP — ⽤户数据报协议,是⼀个⽆连接的简单的⾯向数据报的运输层协 议。UDP不提供可靠性,它只是把应⽤程序传给IP层的数据报发送出去,但是并不能保证它们能到达⽬的地。由于UDP在传输数据报前不⽤在客户和服 务器之间建⽴⼀个连接,且没有超时重发等机制,故⽽传输速度很快
UDP是⼀种⾯向⽆连接的协议,每个数据报都是⼀个独⽴的信息,包括完整 的源地址或⽬的地址,它在⽹络上以任何可能的路径传往⽬的地,因此能否 到达⽬的地,到达⽬的地的时间以及内容的正确性都是不能被保证的。
UDP通信这里采用socket通信方法,其方法已经在【TCP通信】原理详解与编程实现(二)说明,这里不再赘述,直接给出代码。

1 send端

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <error.h>
#include <stdlib.h>
#include <arpa/inet.h>
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<<"create  socket"<<endl;
    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 <iostream>
#include <cstdio>
#include <cstring>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <error.h>
#include <cstdlib>
#include <arpa/inet.h>
#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<<"bind error"<<std::endl;
        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 

效果:

在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值