C++把数据保存在网络上

请问各位,C++该怎么将数据保存在网络上?
比如,我要做一个游戏,需要创建一个用户名,这时就需要联网查找有没有与这个用户名重复的名字。如果没有重复的名字就代表创建成功,然后将这个用户名保存在网上。这个过程该怎样实现?我很着急!时间不多了!

如果是局域网的话,可以用sql server这样的数据库,不需要你写网络通讯的代码,直接就能存入服务器
如果是internet网,可以考虑用 http post 的方式提交数据

如果你是初学者,建议使用短连接服务器,cpp-httplib是一个c++封装的http开源库,仅包含一个头文件,
下载地址:https://github.com/yhirose/cpp-httplib
使用很简单,比如处理Get方式的用户登录的请求:

httplib::Server server;
    auto login = [](const httplib::Request & req, httplib::Response & rsp) {
        rsp.status = 200;
        rsp.set_content("<html><h1> hello login!</h1></html>", "text/html");
    };
    server.Get("/login", login);
    server.listen("0.0.0.0", 80); 

数据库查询简单点,建议使用mysql,我这里有源码,有需要请点赞采纳

您需要使用网络通信协议和技术来实现此功能。通常情况下,您需要将用户的用户名和其他数据发送到服务器,然后使用服务器上的数据库或文件来保存这些数据。当其他用户使用相同的用户名注册时,服务器可以检查数据库或文件以查看是否已经存在相同的用户名。
在编写代码之前,您需要确保具有熟练的网络编程知识。主要的网络编程库包括Boost网络库和网络套接字库等。您可以使用这些库来创建客户端和服务器应用程序,并使它们能够进行通信。此外,还需要了解服务器配置和管理等方面的知识。

使用本地数据库、通过和其它节点通信查询
或者在统一服务器上存储、本地访问服务器查询

该回答引用GPT
你可以使用网络编程来实现这个功能。具体来说,你可以使用套接字(socket)来与服务器进行通信,将用户名发送给服务器,服务器再进行查重操作,最后将结果返回给客户端。

以下是一个简单的示例代码,仅供参考:

客户端:

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

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

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

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

    // 连接服务器
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器 IP 地址
    serverAddr.sin_port = htons(12345); // 服务器端口号
    if (connect(sock, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
        std::cerr << "connect failed." << std::endl;
        closesocket(sock);
        WSACleanup();
        return 1;
    }

    // 发送用户名
    std::string username = "test";
    send(sock, username.c_str(), username.length(), 0);

    // 接收结果
    char result[1024];
    int recvLen = recv(sock, result, sizeof(result), 0);
    if (recvLen > 0) {
        result[recvLen] = '\0';
        std::cout << "Result: " << result << std::endl;
    }

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

    // 清理 Winsock
    WSACleanup();

    return 0;
}

服务器:

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

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

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

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

    // 绑定端口
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serverAddr.sin_port = htons(12345); // 监听端口号
    if (bind(listenSock, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
        std::cerr << "bind failed." << std::endl;
        closesocket(listenSock);
        WSACleanup();
        return 1;
    }

    // 监听端口
    if (listen(listenSock, SOMAXCONN) == SOCKET_ERROR) {
        std::cerr << "listen failed." << std::endl;
        closesocket(listenSock);
        WSACleanup();
        return 1;
    }

    // 接受连接
    SOCKET clientSock = accept(listenSock, NULL, NULL);
    if (clientSock == INVALID_SOCKET) {
        std::cerr << "accept failed." << std::endl;
        closesocket(listenSock);
        WSACleanup();
        return 1;
    }

    // 接收用户名
    char username[1024];
    int recvLen = recv(clientSock, username, sizeof(username), 0);
    if (recvLen > 0) {
        username[recvLen] = '\0';
        std::cout << "Username: " << username << std::endl;

        // TODO: 在数据库中查找是否有重复的用户名

        // 返回结果
        send(clientSock, "OK", 2, 0);
    }

    // 关闭套接字
    closesocket(clientSock);
    closesocket(listenSock);

    // 清理 Winsock
    WSACleanup();

    return 0;
}

需要注意的是,这只是一个简单的示例代码,实际应用中还需要考虑很多问题,比如数据加密、防止恶意攻击等。

https://github.com/yhirose/cpp-httplib

建议看一下这个库,只需要下载他的头文件放到你的项目里面,就可以快速的实现HTTP客户端、HTTP服务端,非常简单。

你这个可以去制作一个HTTP服务端用来做服务器,保存各种信息,然后游戏客户端通过HTTP服务访问HTTP服务器去进行查询、数据保存。

建议使用JSON做数据交互。

下面这个又是一个仅头文件的库,可以直接用,README里面的例子也很清晰。

https://github.com/nlohmann/json

C++在进行网络数据存储时,一般可以使用数据库来完成。常见的数据库有 MySQL、Oracle、SQL Server 等等,它们都支持 C++ 开发者使用相应的 API 进行数据库操作。

以下是一个使用 MySQL 数据库来保存用户名的例子,需要使用 mysql-cppconn 库,这个库提供了 C++ 语言访问 MySQL 数据库的接口。

#include <iostream>
#include <string>
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>

using namespace std;
using namespace sql;

int main() {
    try {
        // 创建一个 MySQL 连接
        Driver *driver = get_driver_instance();
        Connection *con = driver->connect("tcp://127.0.0.1:3306", "root", "password");
        // 设置目标数据库
        con->setSchema("mydb");

        // 输入用户名
        string username;
        cin >> username;

        // 查询是否存在重复的用户名
        PreparedStatement *prep_stmt = con->prepareStatement(
            "SELECT COUNT(*) FROM users WHERE username=?");
        prep_stmt->setString(1, username);
        ResultSet *res = prep_stmt->executeQuery();

        int count = 0;
        if (res->next()) {
            count = res->getInt(1);
        }

        delete res;
        delete prep_stmt;

        // 如果不存在重复的用户名,则保存此用户名到数据库中
        if (count == 0) {
            PreparedStatement *stmt = con->prepareStatement(
                "INSERT INTO users(username) VALUES (?)");
            stmt->setString(1, username);
            stmt->executeUpdate();
            delete stmt;

            cout << "用户名创建成功!" << endl;
        } else {
            cout << "该用户名已存在,请重试!" << endl;
        }

        // 断开数据库连接
        con->close();
        delete con;
    } catch (SQLException &e) {
        cerr << "Error: " << e.what() << endl;
        cerr << "Code: " << e.getErrorCode() << endl;
        cerr << "State: " << e.getSQLState() << endl;
    }

    return 0;
}

在这个程序中,首先需要输入要保存的用户名。然后利用 PreparedStatement 对象查询是否存在与此用户名相同的记录。如果不存在,则利用另一个 PreparedStatement 对象将此用户名插入到数据库中。如果存在,则提示用户将重复提交。最后,关闭数据库连接并释放资源。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^