tcp/ip

这里写自定义目录标题

    • 线程 防止阻塞
  • 1
  • 2
  • 3 windows下
  • 4

https://zhuanlan.zhihu.com/p/139454200

https://www.bilibili.com/video/BV1eg411G7pW/?spm_id_from=333.337.search-card.all.click&vd_source=e7d12c9f66ab8294c87125a95510dac9

with socket.socket() as s:
	s.bind()
	s.listern()
	c,addr = s.accept()
	

在这里插入图片描述
0 0 0 0 特殊的地址 单纯代表主机端任意网卡都可以使用这个socket进行通信
后面接受客户端ip地址
一次接受最大长度 1024个字节

nc 服务器ip地址 端口号 netcat
nmap

repr() 函数将对象转化为供解释器读取的形式。
返回一个对象的 string 格式。

在这里插入图片描述

线程 防止阻塞

https://zhuanlan.zhihu.com/p/100151937

TCP/IP是计算机网络中的一个协议族,用于在网络中实现数据通信和互联网连接。C++语言可以使用Socket库来实现TCP/IP通信。

以下是基本的TCP/IP代码示例:

导入Socket库
cpp
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
创建套接字
cpp
int sock = socket(AF_INET, SOCK_STREAM, 0);
设置服务器地址
cpp
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8080);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
连接服务器
cpp
connect(sock, (struct sockaddr*) &serverAddr, sizeof(serverAddr));
发送数据
cpp
const char* sendData = "Hello Server!";
send(sock, sendData, strlen(sendData), 0);
接收数据
cpp
char recvData[1024] = {0};
recv(sock, recvData, sizeof(recvData), 0);
printf("Received: %s\n", recvData);
关闭套接字
cpp
close(sock);
这个简单的代码示例展示了如何使用C++语言进行TCP/IP通信。当然,在实际开发中,还需要考虑更多的细节和错误处理,但这个示例可以作为一个起点。

1

以下是一个基本的Tcp/ip服务器和客户端代码(使用C++编写),其中服务器将侦听端口并接受传入连接,然后读取来自客户端的消息并返回响应。客户端将连接到服务器,并发送一条消息,然后等待响应。

服务器代码:

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(void)
{
    int sockfd, newsockfd, portno;
    socklen_t clilen;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;
    int n;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        std::cerr << "ERROR opening socket" << std::endl;
        exit(1);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    portno = 12345;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portno);

    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
        std::cerr << "ERROR on binding" << std::endl;
        exit(1);
    }

    listen(sockfd, 5);
    clilen = sizeof(cli_addr);
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
    if (newsockfd < 0) {
        std::cerr << "ERROR on accept" << std::endl;
        exit(1);
    }

    bzero(buffer, 256);
    n = read(newsockfd, buffer, 255);
    if (n < 0) {
        std::cerr << "ERROR reading from socket" << std::endl;
        exit(1);
    }

    std::cout << "Here is the message: " << buffer << std::endl;

    n = write(newsockfd, "I got your message", 18);
    if (n < 0) {
        std::cerr << "ERROR writing to socket" << std::endl;
        exit(1);
    }

    return 0;
}

在服务器代码中,我们首先创建一个套接字(socket()),然后绑定到指定的端口和IP地址(bind())。然后我们侦听传入连接请求(listen())并等待客户端连接(accept())。一旦连接建立,我们从套接字读取数据(read()),然后将响应写回到套接字(write())。

客户端代码:

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

int main(int argc, char *argv[])
{
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer[256];
    if (argc < 3) {
        std::cerr << "usage " << argv[0] << " hostname port" << std::endl;
        exit(0);
    }

    portno = atoi(argv[2]);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        std::cerr << "ERROR opening socket" << std::endl;
        exit(1);
    }

    server = gethostbyname(argv[1]);
    if (server == NULL) {
        std::cerr << "ERROR, no such host" << std::endl;
        exit(0);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
    serv_addr.sin_port = htons(portno);

    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {
        std::cerr << "ERROR connecting" << std::endl;
        exit(1);
    }

    std::cout << "Please enter the message: ";
    bzero(buffer,256);
    std::cin.getline(buffer,255);
    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) {
        std::cerr << "ERROR writing to socket" << std::endl;
        exit(1);
    }

2

这两个头文件是用于在不同操作系统上进行网络编程的。具体来说:

<sys/socket.h> 和 <sys/types.h> 是用于在类UNIX系统上进行网络编程的头文件,提供了许多与套接字相关的函数和数据结构。
Winsock 是用于在Windows操作系统上进行网络编程的API。它定义了一组函数、数据结构和常量,用于创建和操作套接字。
因此,<sys/socket.h> 和 <sys/types.h> 主要用于类UNIX系统,而Winsock主要用于Windows系统。它们之间的区别在于它们所定义的函数和数据结构以及它们在不同操作系统上的实现方式。如果您想在不同的操作系统上进行网络编程,您需要使用相应的头文件和API。

3 windows下

#include <iostream>
#include <winsock2.h>

#pragma comment(lib,"ws2_32.lib")

int main()
{
    WSADATA wsaData;
    SOCKET serverSocket, clientSocket;
    SOCKADDR_IN serverAddr, clientAddr;
    int clientAddrLen = sizeof(clientAddr);
    char buf[1024] = { 0 };
    int ret;

    // 初始化 Winsock
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        std::cerr << "WSAStartup failed" << std::endl;
        return -1;
    }

    // 创建套接字
    serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (serverSocket == INVALID_SOCKET)
    {
        std::cerr << "socket failed: " << WSAGetLastError() << std::endl;
        WSACleanup();
        return -1;
    }

    // 填充地址结构体
    memset(&serverAddr, 0, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(8888);
    serverAddr.sin_addr.s_addr = INADDR_ANY;

    // 绑定套接字到指定地址和端口
    if (bind(serverSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
    {
        std::cerr << "bind failed: " << WSAGetLastError() << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return -1;
    }

    // 开始监听连接请求
    if (listen(serverSocket, 5) == SOCKET_ERROR)
    {
        std::cerr << "listen failed: " << WSAGetLastError() << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return -1;
    }

    std::cout << "waiting for connection..." << std::endl;

    // 接受连接请求
    clientSocket = accept(serverSocket, (SOCKADDR*)&clientAddr, &clientAddrLen);
    if (clientSocket == INVALID_SOCKET)
    {
        std::cerr << "accept failed: " << WSAGetLastError() << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return -1;
    }

    std::cout << "connection accepted" << std::endl;

    // 接收客户端发送的数据
    ret = recv(clientSocket, buf, sizeof(buf), 0);
    if (ret > 0)
    {
        std::cout << "received data from client: " << buf << std::endl;
    }

    // 关闭套接字
    closesocket(clientSocket);
    closesocket(serverSocket);
    WSACleanup();

    return 0;
}




#include <iostream>
#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

int main()
{
    // 初始化Winsock库
    WSADATA wsa;
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
        std::cout << "Failed to initialize Winsock" << std::endl;
        return 1;
    }

    // 创建套接字
    SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (serverSocket == INVALID_SOCKET) {
        std::cout << "Failed to create socket: " << WSAGetLastError() << std::endl;
        WSACleanup();
        return 1;
    }

    // 绑定套接字到端口
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(8888);
    if (bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
        std::cout << "Failed to bind socket: " << WSAGetLastError() << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return 1;
    }

    // 监听连接请求
    if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {
        std::cout << "Failed to listen on socket: " << WSAGetLastError() << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return 1;
    }
    std::cout << "Server is listening on port 8888..." << std::endl;

    // 接受客户端连接
    sockaddr_in clientAddr;
    int clientAddrSize = sizeof(clientAddr);
    SOCKET clientSocket = accept(serverSocket, (sockaddr*)&clientAddr, &clientAddrSize);
    if (clientSocket == INVALID_SOCKET) {
        std::cout << "Failed to accept client connection: " << WSAGetLastError() << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return 1;
    }
    std::cout << "Client connected from " << inet_ntoa(clientAddr.sin_addr) << ":" << ntohs(clientAddr.sin_port) << std::endl;

    // 发送和接收数据
    char buffer[1024];
    int recvSize, sendSize;
    do {
        recvSize = recv(clientSocket, buffer, sizeof(buffer), 0);
        if (recvSize > 0) {
            std::cout << "Received " << recvSize << " bytes of data: " << buffer << std::endl;
            sendSize = send(clientSocket, buffer, recvSize, 0);
            if (sendSize == SOCKET_ERROR) {
                std::cout << "Failed to send data to client: " << WSAGetLastError() << std::endl;
                break;
            }
        } else if (recvSize == 0) {
            std::cout << "Client disconnected" << std::endl;
        } else {
            std::cout << "Failed to receive data from client: " << WSAGetLastError() << std::endl;
            break;
        }
    } while (true);

    // 关闭套接字和Winsock库
    closesocket(clientSocket);
    closesocket(serverSocket);
    WSACleanup();

    return 0;
}
上述代码实现了一个简单的TCP/IP服务器,该服务器监听端口号8888,等待客户端连接并接收数据。对于每个成功接收到的数据包,服务器将其原封不动地发送回给客户端。

客户端

#include <iostream>
#include <winsock2.h>

#pragma comment(lib,"ws2_32.lib")

int main()
{
    WSADATA wsaData;
    SOCKET clientSocket;
    SOCKADDR_IN serverAddr;
    char buf[1024] = "Hello, server!";
    int ret;

    // 初始化 Winsock
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        std::cerr << "WSAStartup failed" << std::endl;
        return -1;
    }

    // 创建套接字
    clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (clientSocket == INVALID_SOCKET)
    {
        std::cerr << "socket failed: " << WSAGetLastError() << std::endl;
        WSACleanup();
        return -1;
    }

    // 填充地址结构体
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(8888);
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    // 连接到服务端
    if (connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
    {
        std::cerr << "connect failed: " << WSAGetLastError() << std::endl;
        closesocket(clientSocket);
        WSACleanup();
        return -1;
    }

    std::cout << "connected to server" << std::endl;

    // 发送数据到服务端
    ret = send(clientSocket, buf, strlen(buf), 0);
    if (ret == SOCKET_ERROR)

4

该语句是一个编译指令,用于在Windows平台上的C/C++程序中链接Winsock库(ws2_32.lib)。当编译器编译源代码时,它将自动地把所需的库文件链接到可执行文件中。通过在源代码中使用#pragma comment(lib,“ws2_32.lib”)语句,我们可以避免手动指定库文件名称和路径,从而简化编译过程并确保程序能够正确运行。

具体来说,这个指令告诉编译器在链接阶段将ws2_32.lib库文件包含在生成的程序中,以便程序能够使用其中定义的Winsock API函数。Winsock库提供了一组用于网络编程的API函数,例如创建套接字、发送和接收数据等。

以下是一个基本的TCP/IP客户端代码,使用C++编写,可以在Windows系统上运行:

#include <WinSock2.h>
#include <Windows.h>
#include <iostream>

#pragma comment(lib, "Ws2_32.lib")

using namespace std;

int main() {
    // 初始化Winsock
    WSADATA wsaData;
    int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (result != 0) {
        cerr << "WSAStartup failed: " << result << endl;
        return 1;
    }

    // 创建套接字
    SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (clientSocket == INVALID_SOCKET) {
        cerr << "socket creation failed: " << WSAGetLastError() << endl;
        WSACleanup();
        return 1;
    }

    // 设置服务器地址和端口
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(12345); // 这里假设服务器端口为 12345
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 这里假设服务器IP为本地

    // 连接服务器
    result = connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr));
    if (result != 0) {
        cerr << "connect failed: " << WSAGetLastError() << endl;
        closesocket(clientSocket);
        WSACleanup();
        return 1;
    }

    // 发送消息
    const char* message = "Hello, server!";
    result = send(clientSocket, message, strlen(message), 0);
    if (result == SOCKET_ERROR) {
        cerr << "send failed: " << WSAGetLastError() << endl;
        closesocket(clientSocket);
        WSACleanup();
        return 1;
    }

    // 接收服务器回复
    char buffer[1024];
    result = recv(clientSocket, buffer, 1024, 0);
    if (result == SOCKET_ERROR) {
        cerr << "recv failed: " << WSAGetLastError() << endl;
        closesocket(clientSocket);
        WSACleanup();
        return 1;
    }
    buffer[result] = '\0';
    cout << "Server response: " << buffer << endl;

    // 关闭套接字
    closesocket(clientSocket);

    // 清理Winsock
    WSACleanup();

    return 0;
}

这个程序执行以下步骤:

  1. 初始化Winsock:使用WSAStartup函数初始化Winsock库。Winsock库是Windows下用来实现网络通信的API。
  2. 创建套接字:使用socket函数创建一个套接字,该套接字用于与服务器建立连接。
  3. 设置服务器地址和端口:创建一个 sockaddr_in 结构体,用于存储服务器的IP地址和端口号。
  4. 连接服务器:使用connect函数连接到服务器。
  5. 发送消息:使用send函数向服务器发送一条消息。
  6. 接收服务器回复:使用recv函数接收服务器发送的回复消息。
  7. 关闭套接字:使用closesocket函数关闭套接字。
  8. 清理Winsock:使用WSACleanup函数释放Winsock库。

需要注意的是,一旦连接成功,就可以使用send和recv函数在客户端和服务器之间交换数据。在这个例子中,我们只发送了一条简单的消息,并接收了服务器的回复。实际应用中,需要根据具体需求进行修改。另外,在使用完套接字后,记得关闭它,以释放资源。

此外,客户端程序还需要链接Winsock库,这可以通过#pragma comment指令来完成,如上面代码所示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/22190.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小航编程题库2022年NOC决赛图形化(小高组)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 单选题3.0分 删除编辑 答案:A 第1题运行下面的程序&#xff0c;最终“我的变量”的值是多少&#xff1f; A、5B、10C、25D、30 答案…

计及N-k安全约束的含光热电站电力系统优化调度模型【IEEE14节点、118节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

南京邮电大学算法与设计实验三:动态规划法(最全最新,与题目要求一致)

实验原理&#xff1a; 1、用动态规划法和备忘录方法实现求两序列的最长公共子序列问题。要求掌握动态规划法思想在实际中的应用&#xff0c;分析最长公共子序列的问题特征&#xff0c;选择算法策略并设计具体算法&#xff0c;编程实现两输入序列的比较&#xff0c;并输出它们的…

编译原理之词法分析实验(附完整C/C++代码与总结)

一、实验内容 通过完成词法分析程序&#xff0c;了解词法分析的过程。编制一个读单词程序&#xff0c;对PL/0语言进行词法分析&#xff0c;把输入的字符串形式的源程序分割成一个个单词符号&#xff0c;即基本保留字、标识符、常数、运算符、分界符五大类。 对PL/0语言进行词法…

【野火启明_瑞萨RA6M5】按键输入检测

文章目录 一、GPIO输入——按键输入检测二、硬件设计三、软件设计下载验证 一、GPIO输入——按键输入检测 按键检测原理 按键机械触点断开、闭合时&#xff0c;由于触点的弹性作用&#xff0c;按键开关不会马上稳定接通或一下子断开&#xff0c;使用按键时会产生 下图中的带波…

APlayer MetingJS 音乐播放器使用指南

文章目录 1.引用2.安装3.APlayer 原生用法4.MetingJS 的用法 1.引用 APlayer 是一个简洁漂亮、功能强大的 Html5 音乐播放器&#xff0c;GitHub地址&#xff1a;https://github.com/DIYgod/APlayer MetingJS 是为 APlayer 添加网易云、QQ音乐等支持的插件&#xff0c;GitHub地…

MySQL 用户管理

目录 用户管理 用户 用户信息 创建用户 删除用户 修改用户密码 数据库的权限 给用户 注意&#xff1a;如果发现赋权限后&#xff0c;没有生效&#xff0c;执行如下指令&#xff1a; 回收权限 用户管理 如果我们只能使用 root 用户&#xff0c;这样存在安全隐患。这时…

用streamlit,几行代码就可以拥有漂亮图表!

大家注意&#xff1a;因为微信最近又改了推送机制&#xff0c;经常有小伙伴说错过了之前被删的文章&#xff0c;比如前阵子冒着风险写的爬虫&#xff0c;再比如一些限时福利&#xff0c;错过了就是错过了。 所以建议大家加个星标&#xff0c;就能第一时间收到推送。&#x1f44…

QTableWidget样式设置

QTableWidget的样式分为几个部分&#xff1a; 分别是&#xff1a; 外框&#xff1a;QTableWidget 表头&#xff1a;QHeaderView 表头字段&#xff1a;QHeaderView::section 表格&#xff1a;QTableWidget::item 选中的表格&#xff1a;QTableWidget::item::selected 水平滚动条…

JDBC详解(六):数据库事务(超详解)

JDBC详解&#xff08;六&#xff09;&#xff1a;数据库事务&#xff08;超详解&#xff09; 前言一、数据库事务介绍二、JDBC事务处理三、事务的ACID属性1、数据库的并发问题2、四种隔离级别3、在MySql中设置隔离级别 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所…

海康威视 2024届 数字逻辑设计 实习笔试分析

说明 记录一下 5月11日晚&#xff0c;做的海康威视的一场笔试。分享给需要的IC人。 岗位&#xff1a;数字逻辑设计工程师&#xff08;浙江 杭州&#xff09; 转载需要本人同意&#xff01; 我的见解不一定都是准确的&#xff0c;欢迎评论区交流指正~~ 单选题 1、&#xff…

一分钟带你了解网络安全(如何自学)

一、关于网络安全职业 早些年&#xff0c;网络安全刚起步&#xff0c;作为一个网络安全从业人员&#xff0c;最苦恼的事情就是每当回到村里变成狗蛋儿的时候&#xff0c;七大姑八大姨&#xff0c;邻里乡亲&#xff0c;村子里的各种人都会来找你&#xff0c;狗蛋儿&#xff0c;你…

研报精选230519

目录 【行业230519头豹研究院】2023年中国产后康复设备行业词条报告 【行业230519山西证券】有色金属行业周报&#xff1a;锂价快速回升&#xff0c;释放锂电行业复苏信号 【行业230519头豹研究院】2023年中国氢能重卡行业词条报告 【个股230519西南证券_森麒麟】腾飞的高端轮胎…

漏扫工具-xray 1.9.10(文末附下载)

一、工具介绍 一款功能强大的安全评估工具 二、使用说明 1.使用基础爬虫爬取并对爬虫爬取的链接进行漏洞扫描 xray webscan --basic-crawler http://example.com --html-output vuln.html 2.使用 HTTP 代理进行被动扫描 xray webscan --listen 127.0.0.1:7777 --html-outp…

【sentinel】Sentinel工作主流程以流控规则源码分析

Sentinel工作主流程 在Sentinel里面&#xff0c;所有的资源都对应一个资源名称&#xff08;resourceName&#xff09;&#xff0c;每次资源调用都会创建一个Entry对象。Entry可以通过对主流框架的适配自动创建&#xff0c;也可以通过注解的方式或调用SphU API显式创建。Entry创…

前端026_菜单模块_新增功能

菜单模块_新增功能 1、需求分析2、新增组件实现3、列表引用新增组件4、关闭弹出窗口5、校验表单数据6、提交表单数据6.1、Mock 添加新增模拟接口6.2、Api 调用接口6.3、测试新增功能1、需求分析 菜单管理中有两处有 新增 按钮: 条件区域的是新增一级菜单,传递的参数是0。列表…

Compose 二三事:绘制原理

setContent做了什么 我们基于一个最简单的例子进行分析 class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {Text(text "Hello World!")}} }这里setContent做了什么…

NetApp FAS 混合闪存阵列协助您建构简单易用、聪明智慧、值得信赖的储存基础架构

NetApp FAS 混合闪存阵列 主要优势 1、简单易用&#xff1a;节省您宝贵的时间、金钱和人力 •几分钟内完成储存资源配置。 •以获证实的效率技术降低成本。 •可在单一系统上管理档案与区块资料。 2、聪明智慧&#xff1a;灵活因应瞬息万变的业务需求 •以不中断营运的方式扩…

java(springboot+ssm)/python/php/nodejs/基于vue的景区门票预约管理系统

后端&#xff1a;java(springbootssm)/python/php/nodejs/ 开发运行&#xff1a;微信开发者/hbuilderx 后端:idea/eclipse/vscode/pycharm 模块划分&#xff1a;公告类型、公告信息、用户信息、用户咨询、地区信息、景区信息、景区开放、景区预约、统计信息 本技术是Java平台的…

企企通“码上顺”清洗工具 | 让数据更有价值,让业务更出色

数据清理工作是企业数据管理、数据治理中的最基础的工作之一&#xff0c;不仅是一项苦活、累活&#xff0c;也是一个既考验业务又检验技术的活。 物料主数据作为企业核心的数据资产&#xff0c;在智慧供应链、业财一体化等数字化建设中发挥着重要作用。在当今高速发展的商业环…