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;

}
相关推荐
不灭锦鲤2 分钟前
网络安全学习第59天
学习·安全·web安全
CQU_JIAKE2 分钟前
4.17[Q]
java·linux·服务器
aq55356004 分钟前
CentOS vs Debian:如何选择最适合的Linux发行版
linux·centos·debian
SilentSamsara6 分钟前
HTTP/1.1 到 HTTP/3:每代协议解决了什么问题
网络·网络协议·tcp/ip·http·https
上海云盾-小余15 分钟前
DDoS 攻击应急响应全流程:从告警触发到业务恢复的黄金 15 分钟
服务器·安全·游戏·ddos
LXY_BUAA19 分钟前
《ubuntu22.04》_新系统的配置_20260418
linux·运维·服务器
上海云盾-小余20 分钟前
API 接口 DDoS 与 CC 攻击防护实战:守住业务最脆弱的数字入口
服务器·ddos
楼田莉子23 分钟前
同步/异步日志系统:日志落地模块\日志器模块\异步日志模块
linux·服务器·c++·学习·设计模式
Flash.kkl1 小时前
传输层UDP、TCP
网络协议·tcp/ip·udp
空中海1 小时前
第七章:iOS网络与数据持久化
网络·ios