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;

}
相关推荐
k4m7v2pz21 分钟前
把 Bevy 0.14 游戏移植到 R36S 掌机:一场与“无窗口系统“的搏斗
linux·rust·bevy·r36s·rk3326·开源掌机
kisloy25 分钟前
【爬虫入门第13讲】Scrapy 框架深度解析(四)核心配置与自定义扩展
网络·爬虫·scrapy
ctlover1 小时前
Python学习第 5 日
学习
六点_dn2 小时前
RabbitMQ学习笔记-部署和使用
笔记·学习·rabbitmq
木子欢儿2 小时前
Intel 架构的 MacBook Pro 运行 Linux 发热量高解决
linux·运维·服务器
夜雪一千2 小时前
TCP数据包长什么样?拆解TCP报文头部结构
网络·网络协议·tcp/ip
德迅云安全杨德俊2 小时前
应用加速:一站式解决企业跨域网络加速与安全双重难题
网络·安全·ddos
瓦学妹3 小时前
什么是网络索引?它是如何工作的?
大数据·网络·python·网络爬虫
2501_926978333 小时前
以说明书 DNA 为模板——完整 AGI 的结构图景
前端·人工智能·经验分享·笔记·ai写作
天天爱吃肉82183 小时前
商用车多体动力学实战笔记|第6篇:动力传动系统(发动机、变速箱、分动器、TCS、LSD限滑差速)
大数据·人工智能·笔记·python·嵌入式硬件·汽车