C++利用libtelnet库完成客户端类封装telnet收发

本文介绍了如何在C++中利用libtelnet库创建一个客户端类,实现telnet的收发功能。内容涵盖CMeshSocket头文件的设计,以及在连接设备服务器时,针对一问一答模式和JSON回复的数据处理策略。同时,建议使用自定义线程池以优化性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CMeshSocket.h头文件

库文件网址https://github.com/seanmiddleditch/libtelnet

需要根据返回数据调整接受规则,我连接设备服务器为一问一答,返回数据为JSON且以\n结尾
请自定义线程池。

static map<CMeshSocket*, TMeshHandler*> s_mapMeshSocket;
#pragma once
#include "libtelnet.h"
#include "MeshString.h"
#include "../ClientUtils/ThreadWrapper.h"

class CMeshSocket :public CThreadWrapper
{
   
public:
	friend class CMeshListFetcher;

public:
	CMeshSocket(string strMac, TDeviceInfo DeviceInfo, short nPort = 9753);
	~CMeshSocket();

	virtual UINT Run();
	string SendCommand(string strCommand, size_t nSeconds = 10000);
	void SetDeviceInfo(TDeviceInfo DeviceInfo);
	double GetRunTime();
	BOOL IsRun();

protected:
	void Input(char *buffer, int size);
	void SplitBuffertoJson(const char *pBuffer);

	static void Send(int sock, const char *buffer, size_t size);
	static void event_handler(telnet_t *telnet, telnet_event_t *ev, void *user_data);

public:
	string m_strMac;
	TDeviceInfo m_DeviceInfo;
	BOOL m_bReConnect;

private:
	short m_nPort;

	SOCKET m_sockServer;        //服务器套接字

	BOOL m_bSend;               //命令是否发送
	BOOL m_bRecv;               //缓冲是否被取走,ture 未被取走,false已经被取走
	
	string m_strCommand;        //执行命令
	string m_strJson;           //命令返回结果

	time_t m_timeStart;         //连接开始时间
	telnet_t *m_telnet;         //telnet库句柄
};

CMeshSocket.cpp文件

#include "stdafx.h"
#include "MeshSocket.h"
#include "MeshListFetcher.h"
#include "MeshScanList.h"

#include <WinSock2.h>
#include <windows.h>

#define BUF_SIZE 100000    //定义缓冲区长度 频谱扫描耗时久

static const telnet_telopt_t telopts[] =
{
   
	{
    TELNET_TELOPT_ECHO,		TELNET_WONT, TELNET_DO },
	{
    TELNET_TELOPT_TTYPE,		TELNET_WILL, TELNET_DONT },
	{
    TELNET_TELOPT_COMPRESS2,	TELNET_WONT, TELNET_DO },
	{
    TELNET_TELOPT_MSSP,		TELNET_WONT, TELNET_DO },
	{
    -1, 0, 0 }
};

CMeshSocket::CMeshSocket(string strMac, TDeviceInfo DeviceInfo, short nPort) :
	m_strMac(strMac), m_nPort(nPort), m_bReConnect(FALSE), m_bSend(TRUE), m_bRecv(FALSE), m_DeviceInfo(DeviceInfo)
{
   
	;
}

CMeshSocket::~CMeshSocket()
{
   
	;
}

UINT CMeshSocket::Run()
{
   
	//初始化DLL
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
   
		m_bStop = TRUE;
		return 10;
	}

	char pBuffer[BUF_SIZE] = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

likesile

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值