tcp实现线程通信的server端实现

.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();
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值