要实现一个可连网的聊天软件,你需要使用网络编程和socket编程来建立客户端和服务器之间的通信。以下是一个简单的示例代码:

客户端代码:

#include <iostream>
#include <string>
#include <WS2tcpip.h>
#pragma comment (lib, "ws2_32.lib")

int main() {
    std::string ipAddress = "127.0.0.1"; // 服务器IP地址
    int port = 54000; // 服务器端口号

    // 初始化Winsock
    WSADATA data;
    WORD version = MAKEWORD(2, 2);
    int wsOk = WSAStartup(version, &data);
    if (wsOk != 0) {
        std::cerr << "无法初始化Winsock" << std::endl;
        return -1;
    }

    // 创建socket
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == INVALID_SOCKET) {
        std::cerr << "无法创建socket" << std::endl;
        WSACleanup();
        return -1;
    }

    // 设置服务器地址和端口
    sockaddr_in hint;
    hint.sin_family = AF_INET;
    hint.sin_port = htons(port);
    inet_pton(AF_INET, ipAddress.c_str(), &(hint.sin_addr));

    // 连接到服务器
    int connResult = connect(sock, (sockaddr*)&hint, sizeof(hint));
    if (connResult == SOCKET_ERROR) {
        std::cerr << "无法连接到服务器" << std::endl;
        closesocket(sock);
        WSACleanup();
        return -1;
    }

    // 循环接收和发送消息
    char buf[4096];
    std::string userInput;

    do {
        // 接收消息
        ZeroMemory(buf, 4096);
        int bytesReceived = recv(sock, buf, 4096, 0);
        if (bytesReceived > 0) {
            std::cout << "服务器: " << std::string(buf, 0, bytesReceived) << std::endl;
        }

        // 发送消息
        std::cout << "> ";
        std::getline(std::cin, userInput);
        int sendResult = send(sock, userInput.c_str(), userInput.size() + 1, 0);
        if (sendResult == SOCKET_ERROR) {
            std::cerr << "无法发送消息" << std::endl;
            break;
        }

    } while (true);

    // 关闭socket
    closesocket(sock);

    // 清理Winsock
    WSACleanup();

    return 0;
}

服务器端代码:

#include <iostream>
#include <string>
#include <WS2tcpip.h>
#pragma comment (lib, "ws2_32.lib")

int main() {
    std::string ipAddress = "127.0.0.1"; // 本地IP地址
    int port = 54000; // 监听端口号

    // 初始化Winsock
    WSADATA data;
    WORD version = MAKEWORD(2, 2);
    int wsOk = WSAStartup(version, &data);
    if (wsOk != 0) {
        std::cerr << "无法初始化Winsock" << std::endl;
        return -1;
    }

    // 创建socket
    SOCKET listening = socket(AF_INET, SOCK_STREAM, 0);
    if (listening == INVALID_SOCKET) {
        std::cerr << "无法创建socket" << std::endl;
        WSACleanup();
        return -1;
    }

    // 设置服务器地址和端口
    sockaddr_in hint;
    hint.sin_family = AF_INET;
    hint.sin_port = htons(port);
    inet_pton(AF_INET, ipAddress.c_str(), &(hint.sin_addr));

    // 绑定socket到IP地址和端口
    bind(listening, (sockaddr*)&hint, sizeof(hint));

    // 开始监听连接
    listen(listening, SOMAXCONN);
    std::cout << "服务器开始监听连接..." << std::endl;

    // 等待连接
    sockaddr_in client;
    int clientSize = sizeof(client);
    SOCKET clientSocket = accept(listening, (sockaddr*)&client, &clientSize);
    char host[NI_MAXHOST];      // 客户端名字
    char service[NI_MAXSERV];   // 客户端服务(端口)号
    ZeroMemory(host, NI_MAXHOST);
    ZeroMemory(service, NI_MAXSERV);

    if (getnameinfo((sockaddr*)&client, sizeof(client), host, NI_MAXHOST, service, NI_MAXSERV, 0) == 0) {
        std::cout << host << "连接到服务器" << std::endl;
    }
    else {
        inet_ntop(AF_INET, &(client.sin_addr), host, NI_MAXHOST);
        std::cout << host << "连接到服务器" << std::endl;
    }

    // 关闭监听socket
    closesocket(listening);

    // 循环接收和发送消息
    char buf[4096];
    while (true) {
        ZeroMemory(buf, 4096);

        // 接收消息
        int bytesReceived = recv(clientSocket, buf, 4096, 0);
        if (bytesReceived == SOCKET_ERROR) {
            std::cerr << "接收消息时出错" << std::endl;
            break;
        }

        if (bytesReceived == 0) {
            std::cout << "客户端断开连接" << std::endl;
            break;
        }

        std::cout << "客户端: " << std::string(buf, 0, bytesReceived) << std::endl;

        // 发送消息
        send(clientSocket, buf, bytesReceived + 1, 0);
    }

    // 关闭socket
    closesocket(clientSocket);

    // 清理Winsock
    WSACleanup();

    return 0;
}

以上代码是一个简单的聊天软件示例,可以在本地运行。你可以根据需要对其进行修改和扩展,以满足具体要求

请用c++写一个可连网的聊天软件

原文地址: https://www.cveoy.top/t/topic/igAl 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录