Linux高并发服务器开发(十一)UDP通信和本地socket通信

文章目录


1 TCP和UDP的区别

2 UDP

API

流程

服务端流程


客户端流程

代码

服务端

cpp 复制代码
#include<sys/socket.h>
#include<stdio.h>
#include<arpa/inet.h>
#include <unistd.h>
#include<sys/time.h>
#include<sys/types.h>
#include<sys/select.h>
#include<sys/epoll.h>
#include <fcntl.h>
#include <strings.h>
#include <string.h>
#include <ctype.h>

int main()
{
    // 创建套接字
    int cfd = socket(AF_INET,SOCK_DGRAM,0);
    if(cfd<0)
    {
        perror("socket error");
        return -1;
    }
    // 绑定
    struct sockaddr_in serv;
    struct sockaddr_in client;

    bzero(&serv, sizeof(serv));
    
    serv.sin_family = AF_INET;
    serv.sin_port = htons(8888);
    serv.sin_addr.s_addr = htonl(INADDR_ANY);
    bind(cfd,(struct sockaddr*)&serv,sizeof(serv));
    
    // while中收发数据
    int n;
    socklen_t len;
    char buf[1024] = "";
    while(1)
    {
        memset(buf,0x00,sizeof(buf));
        len = sizeof(client);
        n = recvfrom(cfd, buf, sizeof(buf),0,(struct sockaddr*)&client, &len);

        // 将大写转换为小写
        for(int i=0;i<n;i++)
        {
            buf[i] = toupper(buf[i]);
        }

        sendto(cfd,buf,n,0, (struct sockaddr*) &client, len);
    }

    close(cfd);
    return 0;
}

客户端

cpp 复制代码
#include<sys/socket.h>
#include<stdio.h>
#include<arpa/inet.h>
#include <unistd.h>
#include<sys/time.h>
#include<sys/types.h>
#include<sys/select.h>
#include<sys/epoll.h>
#include <fcntl.h>
#include <strings.h>
#include <string.h>
#include <ctype.h>

int main()
{
    // 创建套接字
    int cfd = socket(AF_INET,SOCK_DGRAM,0);
    if(cfd<0)
    {
        perror("socket error");
        return -1;
    }


  
    
    // while中收发数据
    int n;
    socklen_t len;
    char buf[1024] = "";
    struct sockaddr_in serv;
    serv.sin_family = AF_INET;
    serv.sin_port = htons(8888);
    inet_pton(AF_INET,"127.0.0.1",&serv.sin_addr.s_addr);

    while(1)
    {
        // 读标准输入数据
        memset(buf, 0x00, sizeof(buf));
        n = read(STDIN_FILENO,buf,sizeof(buf));
        // 发送数据
        sendto(cfd,buf,n,0, (struct sockaddr*) &serv, sizeof(serv));


        memset(buf,0x00,sizeof(buf));
        // 接受数据
        n = recvfrom(cfd, buf, sizeof(buf),0,NULL, NULL);

        printf("n = [%d], buf = [%s]\n",n,buf);
    }

    close(cfd);
    return 0;
}

3 本地socket通信

创建成功后,会在内核中创建缓冲区



流程

服务端

cpp 复制代码
#include<sys/socket.h>
#include<stdio.h>
#include<arpa/inet.h>
#include <unistd.h>
#include<sys/types.h>
#include <fcntl.h>
#include <strings.h>
#include <string.h>
#include <ctype.h>
#include <sys/un.h>

int main()
{
    // 创建socket
    int lfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if(lfd<0)
    {
        perror("socket error");
        return 1;
    }

    // 删除 serv.sock文件
    unlink("serv.sock");

    // 绑定
    struct sockaddr_un serv;
    serv.sun_family = AF_UNIX;
    strcpy(serv.sun_path, "./serv.sock");
    int ret = bind(lfd, (struct sockaddr*)&serv,sizeof(serv));
    if(ret < 0)
    {
        perror("bind");
        return 1;
    }
    // 监听
    listen(lfd,128);
    // 接受新的客户端连接
    struct sockaddr_un client;
    socklen_t len = sizeof(client);
    int cfd = accept(lfd, (struct sockaddr*)&client, &len);
    if(cfd < 0)
    {
        perror("accpet error");
        return -1;
    }

    int n;
    int i;
    char buf[1024];
    while(1)
    {
        memset(buf, 0x00, sizeof(buf));
        // 读数据
        n = read(cfd, buf, sizeof(buf));
        if(n<=0)
        {
            printf("read error or  client clsoe");
            break;
        }
        // 发送数据
        for(i = 0;i<n;i++)
        {
            buf[i] = toupper(buf[i]);
        }

        write(cfd,buf,n);
    }

    close(cfd);
    close(lfd);

    return 0;

}

客户端

客户端代码

cpp 复制代码
#include<sys/socket.h>
#include<stdio.h>
#include<arpa/inet.h>
#include <unistd.h>
#include<sys/types.h>
#include <fcntl.h>
#include <strings.h>
#include <string.h>
#include <ctype.h>
#include <sys/un.h>

int main()
{
    // 创建socket
    int cfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if(cfd<0)
    {
        perror("socket error");
        return 1;
    }

    // 连接服务端
    struct sockaddr_un serv;
    serv.sun_family = AF_UNIX;
    strcpy(serv.sun_path, "./serv.sock");

    connect(cfd, (struct sockaddr*)&serv, sizeof(serv));

    int n;
    int i;
    char buf[1024];
    while(1)
    {
        memset(buf, 0x00, sizeof(buf));
        n = read(STDIN_FILENO, buf, sizeof(buf));
        // 发送数据
        write(cfd,buf,n);

        // 读数据
        memset(buf, 0x00, sizeof(buf));
        n = read(cfd, buf, sizeof(buf));
        if(n<=0)
        {
            printf("read error or  client clsoe");
            break;
        }
        
    }

    close(cfd);

    return 0;

}
相关推荐
weixin_444579304 分钟前
Rockylinux 与 K8s 的安装
linux·云原生·容器·kubernetes
听风3476 分钟前
Arch Linux 包管理 TUI 工具集
linux·服务器·archlinux
Interview Aid11210 分钟前
Akuna OA 题目拆解|三题思路复盘
linux·运维·算法·面试·职场和发展
天天爱吃肉821816 分钟前
XCP协议 Part 1 概述 — 完整学习笔记(商用车主机厂工程师版)
大数据·笔记·python·学习·汽车
聚搜云——JuSouClouD20 分钟前
上海阿里云代理商(聚搜云)分享:ECS 服务器 CPU 跑满 100%,如何找到占用高的进程
服务器·阿里云·云计算
我的xiaodoujiao21 分钟前
Django 基础知识详细图文教程 1-Django 介绍
后端·python·学习·测试工具·django
qq210846295322 分钟前
Ubuntu 磁盘空间清理实战:从 Docker 到 VirtualBox 的完整指南
linux·ubuntu·docker
蒲锘23 分钟前
DevOps 项目阶段笔记二:Docker Engine + cri-dockerd
笔记·docker·devops
酣大智35 分钟前
华为端口隔离(port‑isolate)
网络·华为
福大大架构师每日一题36 分钟前
webrtc-rs/webrtc v0.20.3更新:Android 网络切换后 ICE Restart 卡死约 10 秒的问题终于解决
android·网络·webrtc