UDP协议实现通信与数据传输(创建客户端和服务器)

目录

[一、UDP (传输层,用户数据报协议)](#一、UDP (传输层,用户数据报协议))

二、服务器Server的创建

三、客户端Client的创建

四、效果实现(描述)


一、UDP (传输层,用户数据报协议)

UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。

适用情况:

1、发送小尺寸数据(如对DNS服务器进行IP地址查询时)

2、在接收到数据,给出应答较困难的网络中使用UDP。

3、适合于广播/组播式通信中。

4、MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议

5、流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输

二、服务器Server的创建

代码如下:

cpp 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    if (argc != 2)
    {
        printf("usage:<port>\n");
        return -1;
    }
    // 1.创建套接字
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("sockfd err");
        return -1;
    }
    printf("sockfd:%d\n", sockfd);
    // 2.绑定ip+port
    struct sockaddr_in saddr, caddr;       // 头文件查看  man 7 ip
    saddr.sin_family = AF_INET;            // sin_family//协议族AF_INET
    saddr.sin_port = htons(atoi(argv[1])); // 端口号port
    socklen_t addrlen = sizeof(saddr);
// 使能开关
#if 0
     saddr.sin_addr.s_addr = inet_addr(argv[1]);//ip
#else
    // 绑定电脑上的所有可用IP给服务器
    saddr.sin_addr.s_addr = INADDR_ANY; // ip
    // saddr.sin_addr.s_addr = inet_addr("0.0.0.0"); // ip
#endif

    if (bind(sockfd, (struct sockaddr *)&saddr, addrlen) < 0)
    {
        perror("bind err");
        return -1;
    }
    printf("bind success\n");

// 3.接收消息
#define N 1024
    char buf[N] = {};
    while (1)
    {
        size_t res = recvfrom(sockfd, buf, N, 0, (struct sockaddr *)&caddr, &addrlen);
        if (res < 0)
        {
            perror("recvfrom err");
            return -1;
        }
        else if (res > 0)

        {
            if (strcmp(buf, "quit") == 0)
            {
                printf("Client Exist\n");
                close(sockfd);
                break;
            }
            printf("ip:%s port:%d\n", inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));
            printf("buf:%s\n", buf);
            memset(buf, 0, N);
        }
    }
    return 0;
}

三、客户端Client的创建

代码如下:

cpp 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    if (argc != 3)
    {
        printf("usage:<ip> <port>\n");
        return -1;
    }
    // 1.创建数据报套接字
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("sockfd err");
        return -1;
    }
    printf("sockfd:%d\n", sockfd);

// 接收
//     recvfrom(sockfd,&buf,N,0,(struct sockaddr *)&saddr, &len);
// 2.发送
   //后面函数需要传结构体指针类型的参数,需要定义一个填充好的结构体
#define N 64
    struct sockaddr_in saddr;                   // 头文件查看  man 7 ip
    saddr.sin_family = AF_INET;                 // sin_family//协议族AF_INET
    saddr.sin_port = htons(atoi(argv[2]));      // 端口号port
    saddr.sin_addr.s_addr = inet_addr(argv[1]); // ip
    socklen_t len = sizeof(saddr);

    char buf[N] = {};
    while (1)
    {
        gets(buf);
        ssize_t Lo = sendto(sockfd, &buf, N, 0, (struct sockaddr *)&saddr, len);//接收消息
        if(strcmp(buf,"quit")==0)//跳出while循环判断条件
        {
            close(sockfd);
            break;           
        }       
        memset(buf,0,N);   
    }
    return 0;
}



// 通用结构体:相当于预留一个空间
// struct sockaddr {
//     sa_family_t sa_family;
//     char        sa_data[14];
// }

// ipv4的结构体 
//  struct sockaddr_in {
//      sa_family_t    sin_family;  //协议族AF_INET
//      in_port_t      sin_port;  //端口
//      struct in_addr sin_addr;   
//  };
//   struct in_addr {
//      uint32_t       s_addr;   //IP地址  
//  };
 

四、效果实现(描述)

sockfd:X

bind success

ip:XXXX.XXXX.XXXX.XXXX port:XXXXX

buf:ggggggggg

Client Exist

相关推荐
linux行者36 分钟前
Linux 资源限制(进程级,用户级,系统级)
linux·运维·服务器
爷一隐居青楼1 小时前
PGSQL结合linux cron定期执行vacuum_full_analyze命令
java·linux·服务器
唐骁虎1 小时前
Ubuntu 桌面版忘记账户密码的重置方法
linux·运维·服务器·ubuntu
庄小焱3 小时前
设计模式——简单工厂模式(创建型)
java·服务器·算法
智联视频超融合平台3 小时前
无人机+AI视频联网:精准狙击,让‘罪恶之花’无处藏身
人工智能·网络协议·安全·系统安全·音视频·无人机
I won.3 小时前
计算机网络 HTTP篇常见面试题总结
网络协议·计算机网络·http
UFIT4 小时前
LVS-DR群集
运维·服务器
笨小蛙4 小时前
服务器Docker容器创建与VScode远程连接SSH使用
服务器·vscode·docker·容器·ssh
Zfox_5 小时前
Redis:功能特性和应用场景
服务器·数据库·redis·缓存·微服务
2401_836836596 小时前
LVS-DR群集
服务器·网络·lvs