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;

}
相关推荐
Love__Tay6 分钟前
【学习笔记】Python金融基础
开发语言·笔记·python·学习·金融
姓刘的哦10 分钟前
ubuntu中使用docker
linux·ubuntu·docker
代码程序猿RIP19 分钟前
【Linux】(1)—进程概念-⑤进程调度
linux·运维
半导体守望者29 分钟前
ADVANTEST R3764 66 R3765 67爱德万测试networki connection programming网络程序设计手册
经验分享·笔记·功能测试·自动化·制造
MrWang.31 分钟前
Ubuntu中SSH服务器安装使用
服务器·ubuntu·ssh
_lizhiqiang34 分钟前
联想拯救者R9000P 网卡 Realtek 8852CE Ubuntu/Mint linux 系统睡眠后,无线网卡失效
linux·运维·ubuntu·r9000p·无线网卡·8852ce
Jeremy_Lee12341 分钟前
grafana 批量视图备份及恢复(含数据源)
前端·网络·grafana
洛神灬殇1 小时前
【LLM大模型技术专题】「入门到精通系列教程」基于ai-openai-spring-boot-starter集成开发实战指南
网络·数据库·微服务·云原生·架构
我的golang之路果然有问题1 小时前
云服务器部署Gin+gorm 项目 demo
运维·服务器·后端·学习·golang·gin
上海云盾第一敬业销售1 小时前
高防IP可以防护什么攻击类型?企业网络安全的第一道防线
网络·tcp/ip·web安全