运行环境

Operating System: Darwin 24.4.0 Darwin Kernel Version 24.4.0: Fri Apr 11 18:33:46 PDT 2025; root:xnu-11417.101.15~117/RELEASE_ARM64_T8112 arm64
Compiler Version: Apple clang version 17.0.0 (clang-1700.0.13.3)
Target: arm64-apple-darwin24.4.0
Thread model: posix

server 端

#include <CommonCrypto/CommonDigest.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
 
#include <cstring>
#include <iomanip>
#include <iostream>
#include <sstream>
 
const int PORT = 8089;
 
std::string calculateMD5(const char* input, ssize_t length);
 
int main() {
    using namespace std;
 
    int socket_descriptor = socket(AF_INET, SOCK_STREAM, 0);
    if (socket_descriptor == -1) {
        cout << "socket error" << endl;
        return -1;
    }
    struct sockaddr_in serverAddress = {.sin_len = sizeof(serverAddress),
                                        .sin_family = AF_INET,
                                        .sin_port = htons(PORT),
                                        .sin_addr = {.s_addr = INADDR_ANY},
                                        .sin_zero = {0}};
 
    // 1. bind
    if (bind(socket_descriptor,
             reinterpret_cast<struct sockaddr*>(&serverAddress),
             sizeof(serverAddress)) == -1) {
        cout << "bind error" << endl;
        return -1;
    }
 
    // 2. listen
    if (listen(socket_descriptor, 5) == -1) {
        cout << "listen error" << endl;
        return -1;
    }
 
    struct sockaddr_in clientAddress;
    socklen_t clientAddressLength = sizeof(clientAddress);
    // 3. accept
    int clientSocket = accept(
        socket_descriptor, reinterpret_cast<struct sockaddr*>(&clientAddress),
        &clientAddressLength);
    if (clientSocket == -1) {
        cout << "accept error" << endl;
        return -1;
    }
    cout << "Client connected" << endl;
    char buffer[1024];
    while (true) {
        // 4. recv
        ssize_t bytesReceived = recv(clientSocket, buffer, sizeof(buffer), 0);
        if (bytesReceived == -1) {
            cout << "recv error" << endl;
            break;
        } else if (bytesReceived == 0) {
            cout << "Client disconnected" << endl;
            break;
        }
        cout << "Received: " << string(buffer, bytesReceived) << endl;
 
        // calculate md5
        string response = calculateMD5(buffer, bytesReceived);
        cout << "MD5: " << response << endl;
 
        // 5. send
        ssize_t bytesSent =
            send(clientSocket, response.c_str(), response.size(), 0);
        if (bytesSent == -1) {
            cout << "send error" << endl;
            break;
        }
    }
    close(clientSocket);
    close(socket_descriptor);
    return 0;
}
 
std::string calculateMD5(const char* input, ssize_t length) {
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5(input, length, digest);
    std::ostringstream oss;
    for (int i = 0; i < CC_MD5_DIGEST_LENGTH; ++i) {
        oss << std::hex << std::setw(2) << std::setfill('0')
            << static_cast<int>(digest[i]);
    }
    return oss.str();
}

client 端

#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
 
#include <cstring>
#include <iostream>
 
int main() {
    using namespace std;
 
    int socket_descriptor = socket(AF_INET, SOCK_STREAM, 0);
    if (socket_descriptor == -1) {
        cout << "socket error" << endl;
        return -1;
    }
 
    struct sockaddr_in serverAddress = {};
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_port = htons(8089);
    serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");  // 使用本地回环地址
 
    // 1. connect
    if (connect(socket_descriptor, (struct sockaddr*)&serverAddress,
                sizeof(serverAddress)) == -1) {
        cout << "connect error" << endl;
        close(socket_descriptor);
        return -1;
    }
 
    cout << "Connected to server!" << endl;
 
    while (true){
        string message;
        cout<< "> ";
        getline(cin, message);
        if (message == "exit") {
            break;
        }
        // 2. send
        ssize_t bytesSent = send(socket_descriptor, message.c_str(), message.size(), 0);
        if (bytesSent == -1) {
            cout << "send error" << endl;
            break;
        }
        cout << "Sent: " << message << endl;
        char buffer[1024];
        // 3. recv
        ssize_t bytesReceived = recv(socket_descriptor, buffer, sizeof(buffer), 0);
        if (bytesReceived == -1) {
            cout << "recv error" << endl;
            break;
        } else if (bytesReceived == 0) {
            cout << "Server disconnected" << endl;
            break;
        }
        cout << "Received: " << string(buffer, bytesReceived) << endl;
    }
 
    close(socket_descriptor);
    return 0;
}

运行结果