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] =