.cpp
#pragma comment(lib,"ws2_32.lib")//链接ws2_32.lib库文件到此项目中
#include "w_tcp_serial_port.h"
#include "sonar_global_variable.h"
#include "CMaster.h"
#include "CFpga.h"
#include "CPlayBackQueueListener.h"
#include "util.h"
w_tcp_serial_port::w_tcp_serial_port(CMaster* master) :
m_pMaster(master)
{
m_bClose = false;
}
w_tcp_serial_port::~w_tcp_serial_port()
{
Close();//关闭
}
bool w_tcp_serial_port::Start()
{
if (!m_bClose) {
m_proc_thread = thread(&w_tcp_serial_port::ThreadProc, this);
return true;
}
return false;
}
void w_tcp_serial_port::Close()
{
if (!m_bClose)
{
m_bClose = true;
if (m_proc_thread.joinable())
{
m_proc_thread.join();
}
}
}
bool w_tcp_serial_port::isClosed()
{
return m_bClose;
}
void w_tcp_serial_port::ThreadProc()
{
// ============== TCP,接收显控发送的命令 ================
SOCKADDR_IN addrSrc;
SOCKADDR_IN addrClient;
SOCKET connfd;
//接收客户端信息
unsigned char recv_tcp_cmd[256] = { 0 }; //从显控台接收命令
int addr_len = sizeof(struct sockaddr_in);
char datetime_string[128];
char date_string[128];
char filename[256];
SOCKET socket_tcp_recv;
socket_tcp_recv = socket(AF_INET, SOCK_STREAM, 0);
if (socket_tcp_recv == INVALID_SOCKET)
{
printf("Socket Creation to receiver TCP CMD error with ID: %d\n", WSAGetLastError());
return;
}
addrSrc.sin_family = AF_INET;
addrSrc.sin_port = htons(RecvPort_TCP_CMD_SRL_PORT);
addrSrc.sin_addr.s_addr = INADDR_ANY;
// ============ 绑定 ============
int ret = -1;
int bTransmitting = 0;//发射命令标记
int bPlayBack_Running = 0;//回放命令标记
while (1)
{
ret = bind(socket_tcp_recv, (SOCKADDR*)&addrSrc, sizeof(addrSrc));
if (ret == 0)
break;
printf("TCP Recv CMD Bind Error With ID: %d\n", WSAGetLastError());
Sleep(1000);
}
//============ 监听==========
ret = listen(socket_tcp_recv, 5);
connfd = accept(socket_tcp_recv, (struct sockaddr*)&addrClient, &addr_len);
timeval time_val;
time_val.tv_sec = 2;
fd_set read_fds;
FD_ZERO(&read_fds);
printf("%d55555555555\n", this->m_bClose);
while (!m_bClose)
{
FD_SET(connfd, &read_fds);
ret = select(connfd + 1, &read_fds, NULL, NULL, &time_val);
if (ret < 0)//Select出错
{
printf("Fail to select!\n");
break;
}
else if (ret == 0)continue;//超时重新检测
if (FD_ISSET(connfd, &read_fds))
{
ret = recv(connfd, (char*)recv_tcp_cmd, sizeof(recv_tcp_cmd) - 1, 0);
if (ret <= 0)//连接断开
{
printf("Fail to read!\n");
m_pMaster->Restart();
break;
}
if (ret > 0)
{
printf("%s\n", recv_tcp_cmd);
//接下来进行处理提取就可以了
continue;
}
::closesocket(connfd);
::closesocket(socket_tcp_recv);
}
}
}
.h
#pragma once
#pragma once
#include <thread>
#include "queue_define.h"
using std::thread;
class CMaster;
/*
* 接收显控命令
*/
class w_tcp_serial_port
{
private:
bool m_bClose;
thread m_proc_thread;
protected:
CMaster* m_pMaster;
public:
w_tcp_serial_port(CMaster* master);
virtual ~w_tcp_serial_port();
bool Start();
void Close();
bool isClosed();
private:
//线程函数
void ThreadProc();
};