C++
C++ 服务端#
.h文件#
注意文中的model
// .h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <signal.h>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class ModelManager;
class ServerManager
{
private:
int m_port;
char *m_addr;
cv::VideoCapture m_cap;
int m_server;
int m_accept; // client conn
public:
bool initialization(const int &port, const cv::VideoCapture &cap, char *addr = nullptr);
bool initialization(const int &port, char *addr = nullptr);
bool build_connect();
bool acceptClient();
void error_print(const char *ptr);
bool free_connect();
bool send_data_frame(ModelManager& model);
bool receive_data_frame(cv::Mat &frame, ModelManager& model);
};
.cpp文件#
#include "ServerManager.h"
#include "ModelManager.h"
#define BUFFER_SIZE 65538
void ServerManager::error_print(const char * ptr) {
perror(ptr);
exit(EXIT_FAILURE);
}
bool ServerManager::initialization(const int& port, const cv::VideoCapture& cap, char* addr){
m_port = htons(port);
m_addr = addr;
m_cap = cap;
return true;
}
bool ServerManager::initialization(const int& port, char* addr){
m_port = htons(port);
m_addr = addr;
return true;
}
bool ServerManager::build_connect() {
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = m_addr?inet_addr(m_addr):INADDR_ANY;
server_addr.sin_port = m_port;
// create socket
m_server = socket(AF_INET, SOCK_STREAM, 0);
if(m_server < 0)
error_print("socket bind error");
// can reuse port
int on = 1;
if(setsockopt(m_server,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)) < 0)
error_print("setsockopt error");
// bind addr
if(bind(m_server, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0)
error_print("bind error");
// listen only one client
if(listen(m_server, 1) < 0)
error_print("listen failed");
cout << "ServerManager is listening, plesae wait..." << endl;
return true;
}
bool ServerManager::acceptClient(){
struct sockaddr_in accept_addr;
socklen_t accept_len = sizeof(accept_addr);
bzero(&accept_addr,sizeof(accept_addr));
// accept client connection
if((m_accept = accept(m_server,(struct sockaddr*)&accept_addr,&accept_len)) < 0)
error_print("accept error");
std::cout << "Connection established" << std::endl;
retur