#include "stdafx.h" #include#include #if defined(_WIN32) #include #include #pragma comment(lib, "ws2_64.lib") #endif // 捕获摄像头图像 cv::Mat captureImage() { cv::VideoCapture cap(0); // 打开默认摄像头,可按需更改参数选择其他摄像头 if (!cap.isOpened()) { std::cerr << "无法打开摄像头" << std::endl; return cv::Mat(); } cv::Mat frame; cap >> frame; cap.release(); return frame; } // 连接服务端函数 bool connectToServer(SOCKET& clientSocket) { // 配置服务端地址信息 sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(8888); // 端口号8888,可按需修改 // 使用inet_pton替换inet_addr char ipAddress[] = "127.0.0.1"; // 本地回环地址,也可替换为真实IP,这里定义为字符数组 int inetResult = inet_pton(AF_INET, ipAddress, &serverAddr.sin_addr); if (inetResult <= 0) { std::cerr << "IP地址转换失败" << std::endl; return false; } // 创建套接字 clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (clientSocket == INVALID_SOCKET) { std::cerr << "创建套接字失败" << std::endl; #if defined(_WIN32) WSACleanup(); #endif return false; } // 连接服务端 if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { std::cerr << "连接服务端失败" << std::endl; #if defined(_WIN32) closesocket(clientSocket); WSACleanup(); #endif return false; } return true; } // 将图片数据发送到服务端函数 void sendImage(SOCKET socket, const cv::Mat& image) { std::vector buffer; cv::imencode(".jpg", image, buffer); // 将图像编码为 JPEG 格式,方便传输 // 发送数据长度信息(假设服务端按这个约定来接收) int bufferSize = buffer.size(); send(socket, (const char*)&bufferSize, sizeof(bufferSize), 0); // 发送图像数据本身 send(socket, (const char*)buffer.data(), buffer.size(), 0); } // 从服务端接收消息函数 std::string receiveMessage(SOCKET socket) { const int bufferSize = 1024; char buffer[bufferSize]; int bytesReceived = recv(socket, buffer, bufferSize - 1, 0); if (bytesReceived > 0) { buffer[bytesReceived] = '\0'; // 添加字符串结束符 return std::string(buffer); } return ""; } int main() { #if defined(_WIN32) // 初始化Winsock库 WSADATA wsaData; int result = WSAStartup(MAKEWORD(2, 2), &wsaData); if (result != 0) { std::cerr << "WSAStartup 失败: " << result << std::endl; return -1; } #endif SOCKET clientSocket; if (!connectToServer(clientSocket)) { return -1; } cv::Mat image = captureImage(); if (image.empty()) { // 关闭套接字并清理(Windows下) #if defined(_WIN32) closesocket(clientSocket); WSACleanup(); #endif return -1; } sendImage(clientSocket, image); std::string receiveResult = receiveMessage(clientSocket); std::cout << "打卡结果: " << receiveResult << std::endl; // 关闭套接字并清理(Windows下) #if defined(_WIN32) closesocket(clientSocket); WSACleanup(); #else close(clientSocket); #endif return 0; }