
运行环境
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;
}
运行结果
