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

相关推荐
Liuqy-051 小时前
IO模型与并发服务器
服务器·网络·select·多线程·epoll·并发服务器·io多路复用
小园子的小菜1 小时前
Netty 核心组件 Channel、ChannelHandler 与简易 RPC 架构实战详解
网络协议·rpc·架构
一条泥憨鱼10 小时前
【计算机网络】短连接、长连接与连接池:从 TCP 握手到池化复用的完整链路
网络·数据库·网络协议·tcp/ip·计算机网络
知已难寻12 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
cyf3112 小时前
第 05 篇:IP 协议—— 网络层的“快递单号与物流追踪“
网络协议·tcp/ip·路由表·traceroute·ip协议·ping·ip分片
huainingning13 小时前
Windows syslog日志服务器搭建与模拟器对接
运维·服务器·智能路由器
say_fall13 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
wacsii14 小时前
【Linux进程(一)】Linux 进程初探:操作系统如何管理进程?fork() 为什么返回两次?
linux·运维·服务器
共享家952714 小时前
408 操作系统第一章
服务器·数据库·windows