拷贝构造函数和TIME_WAIT状态的意义

/************深拷贝 浅拷贝***********/
c++默认拷贝构造函数是浅拷贝,
因此要实现深拷贝我们需要重新写,


防止默认拷贝发生 因为默认拷贝构造函数 会造成赋值等操作 调用默认拷贝,
但是只是执行了浅拷贝,所以导致程序结束,调用析构函数释放空间的时候
会释放两次。这就出问题了
所以要么禁用默认拷贝构造函数
要么自己重写拷贝构造函数


默认拷贝构造函数 不处理静态对象 static
也不处理 new的那些指针对象 并没有单独的空间 只是指向一个地方 所以析构的时候出了问题


#define  DISALLOW_COPY_AND_ASSIGN(TypeName) \

TypeName(const TypeName&); \
TypeName& operator=(const TypeName&)


class Rect
{
public:

Rect() { p = new int(100); }

//没有这两个的话 程序最后会崩溃,p指向的空间释放了两次

Rect(const Rect& r) 

p = new int; 
*p = *(r.p);
width = r.width;
height = r.height;
}
Rect& operator=(const Rect& r)
{
p = new int;
*p = *(r.p);
width = r.width;
height = r.height;
}
~Rect() { delete p; }

private:

//或者使用这个 禁掉默认拷贝构造函数

//DISALLOW_COPY_AND_ASSIGN(Rect);

private:
int* p;
int width;
int height;

};

int main()

{

Rect r1;
Rect r2 = r1;
Rect r3(r1);

}


/************TCP***********/
常用的TCP选项
mss 1500 1460 最大分节 本连接接每个TCP分节中愿意接受的最大数据量
滑动窗口 拥塞控制 SO_RCVBUF 一般最大65535 16位 卫星通信等可以更大 提高吞吐量
时间戳 高速连接 失而复现分组可能造成的数据破坏

TIME_WAIT状态会维持2个msl 存在理由何在
讲道理直接结束不是完了 为何还要维护这个状态,
1 因为它是主动断开的,最后一个ack是由它发的,如果这个丢了,它也直接关掉了,
那么对端就收不到这个最后一个ack,就算异常 rst了
2 等TIME_WAIT完了后才能重新建立连接,否则,重新连接,上次的报文还在路上,
新连接已经建立,误以为老的报文是新连接的数据。这就不对了

```c widsWips.c main() _widsWipsStateEventRegister() evloop_add(l_wids_wips_listen_event_fd) _widsWipsListenEventHandler() evloop_add(l_wids_wips_msg_event_fd) _widsWipsMsgEventHandler() // 接收uclite的消息,然后调用_widsWipsUnixMsgHandler _widsWipsUnixMsgHandler() // 对接收的消息pmsg->type判断 ,然后执行不同的处理逻辑 ``` ```c _widsWipsUnixMsgHandler() msg->type == WIDS_WIPS_MSG_INIT _widsWipsMsgInit() // 根据pMsg信息,构造 WIDS_WIPS_NETLINK_MSG netlinkMsg; // 拷贝pMsg->chanList[rid] 更新 l_chanList 1._widsWipsNetlinkRegister(&netlinkMsg) _widsWipsNetlinkInit(&netlinkMsg)// 用来初始化内核的信息,并发送init信息 让内核初始化 evloop_add(_widsWipsNetlinkEventHandler()) _widsWipsNetlinkEventHandler() // pMsg->type == NETLINK_DY_BLACK_LIST 则是内核上传的动态黑名单表,根据检测到的各种异常事件更新的,完全拷贝到l_result.dyBlackListTable // pMsg->type == NETLINK_EVENT 则是内核上传的事件, 更新l_result.eventTable // 如果是 EVENT_ADHOC_USE_VALID_SSID EVENT_VALID_SSID_MISUSE事件, // 匹配 pMsg->data.event.bssid, l_bssidCheckList.entry[i].bssid, // BSSID_CHECK_IS_NOT_SAME_SITE == l_bssidCheckList.entry[i].status) // (0 == l_bssidCheckList.entry[i].isNotify) // 则向内核传递sendMsg.type = NETLINK_ADD_DEAUTH_LIST;反制命令 2._widsWipsScanTimingRegister() evloop_timeout_set(_widsWipsScanTimingHandler())//定时事件 _widsWipsScanTimingHandler() // 进行天线扫描 // 周期性地扫描不同的无线频道 调用 api_widsWipsSetScan() 3._widsWipsDeauthContainTimingRegister() evloop_timeout_set(_widsWipsDeauthContainTimingHandler())//定时事件 _widsWipsDeauthContainTimingHandler() _widsWipsNotify(UCL_OPID_WIDSWIPS_DEAUTH_CONTAIN, WIDS_WIPS_DEAUTH_FLAG); unix_sock_sendDataToSrvWithoutResp(UNIX_SOCK_ID_MSG_CENTER)// notify uclite 下达反制命令 // 定时上报处理函数,将需要deauth的事件(结合白名单)标记筛选,并通知uclite的wids模块拿取结果 4._widsWipsNotifyResultTimingRegister() evloop_timeout_set(_widsWipsNotifyResultTimingHandler())// 定时事件 _widsWipsNotifyResultTimingHandler() // 周期性的上报事件检测结果 _widsWipsRecheckTimingHandler() // BSSID(基本服务集标识符)重新检查定时处理函数 ``` _widsWipsUnixMsgHandler(): ```c msg->type == WIDS_WIPS_MSG_WIDS_CFG _widsWipsMsgWidsCfg(WIDS_WIPS_MSG *pMsg)// 根据接收䣌pMsg信息,构造WIDS_WIPS_NETLINK_MSG,后发送给内核,并更新WIDS_WIPS_CFG l_widsWipsCfg netlinkMsg.type = NETLINK_SET_WIDS_CFG; ``` ```c msg->type == WIDS_WIPS_MSG_WIPS_CFG _widsWipsMsgWipsCfg(WIDS_WIPS_MSG *pMsg)// 根据接收的pMsg信息,构造WIDS_WIPS_NETLINK_MSG,后发送给内核,并更新WIDS_WIPS_CFG l_widsWipsCfg netlinkMsg.type = NETLINK_SET_WIPS_CFG; ``` ```c msg->type == WIDS_WIPS_MSG_DEL_BLACK_LIST _widsWIpsDelBlackList(WIDS_WIPS_MSG *pMsg)// 根据接收的pMsg信息,构造NETLINK_DEL_BLACK_LIST WIDS_WIPS_NETLINK_MSG,后发送给内核 netlinkMsg.type = NETLINK_SET_WIPS_CFG; ``` ```c msg->type == WIDS_WIPS_MSG_SET_DEAUTH_WHITE_LIST _widsWipsParaseDeauthWhiteList(WIDS_WIPS_DEAUTH_WHITE_TABLE * &(pMsg->deauthWhiteTable))// 对接收的pTable, 如果接收的pTable 与 l_bssidCheckList存在相同的mac则, 更新l_bssidCheckList.entry[j].status 从BSSID_CHECK_WAIT_RESULT 到 BSSID_CHECK_IS_SAME_SITE; // 其核心功能是根据传入的白名单表(pTable)更新全局的 BSSID 检查列表(l_bssidCheckList)的状态,用于判断检测到的 BSSID 是否属于同一可信站点(Same Site)。 ``` ```c // 被收养传入配置信息?? msg->type == WIDS_WIPS_MSG_ENTER_ISOLATED _widsWipsMsgIsolated(WIDS_WIPS_MSG *pMsg)// netlinkMsg.type = NETLINK_INIT; // 根据pmsg的信息构造WIDS_WIPS_NETLINK_MSG ``` ```c msg->type == WIDS_WIPS_MSG_LEAVE_ISOLATED _widsWipsMsgIsolated(WIDS_WIPS_MSG *pMsg)// netlinkMsg.type = NETLINK_INIT; // 根据l_widsWipsCfg的信息构造WIDS_WIPS_NETLINK_MSG ``` 把我这部分的代码书写写成plantuml
最新发布
11-22
#endif#include “XRayControl.h” #include “common\PiercingEyeSetting.h” #include using namespace drive; const int g_SerialFailedTimes = 3; //串口发送重试次数 drive::XRayControl::XRayControl(QObject * parent) :QObject(parent) , m_pXRayHelp(NULL) , m_nOutVol(0) , m_nOutCur(0) , m_nUseTime(0) { } drive::XRayControl::~XRayControl() { delete m_pXRayThread; m_pXRayThread = nullptr; } bool drive::XRayControl::Init() { m_stXRaySettingParams = common::PiercingEyeSetting::GetInstall().GetXRayPortParams(); switch (m_stXRaySettingParams.eXRayType) { case Hamamatsu_L10941_05: if (NULL == m_pXRayHelp) { m_pXRayHelp = new drive::HamamatsuHelp(); } break; case Hamamatsu_L9181_05: break; case Comet_Cube: if (NULL == m_pXRayHelp) { m_pXRayHelp = new drive::CometCubeHelper(); } break; default: break; } for (int i = XRMT_STS; i < XRMT_NUMS; i++) { m_XRayStatusMap[i] = 0; } m_pXRayThread = new QThread; m_pXRayHelp->moveToThread(m_pXRayThread); m_pXRayHelp->SetPortParams(m_stXRaySettingParams.sPortName, (QSerialPort::BaudRate)m_stXRaySettingParams.nBaudRate); connect(m_pXRayThread, &QThread::started, m_pXRayHelp, &SerialPortBase::OnSerialThreadStarted); connect(m_pXRayThread, &QThread::finished, m_pXRayHelp, &QObject::deleteLater); //射线源数据更新 connect(m_pXRayHelp, &SerialPortBase::SigMapParamsUpdate, this, &XRayControl::OnXRayStatusChanged, Qt::UniqueConnection); //射线源使用时间刷新 connect(m_pXRayHelp, &SerialPortBase::SigUpdateXRayUseTime, this, &XRayControl::SigUpdateXRayUseTime); //射线源逆初始化 connect(this, &XRayControl::SigUnInit, m_pXRayHelp, &SerialPortBase::UnInit); //射线源软复位 connect(this, &XRayControl::SigXRayRst, m_pXRayHelp, &SerialPortBase::OnResetXRay); //射线源预热指令 connect(this, &XRayControl::SigXRayWarmUp, m_pXRayHelp, &SerialPortBase::OnWarmUpXRay); //设置电压电流 connect(this, &XRayControl::SigSetXRayElectricParams, m_pXRayHelp, &SerialPortBase::OnSetXRayParams); //开启或关闭射线源 connect(this, &XRayControl::SigSetXRaySwitch, m_pXRayHelp, &SerialPortBase::OnSwitchXRay); m_pXRayThread->start(); return false; } bool drive::XRayControl::UnInit() { emit SigSetXRaySwitch(false); //添加阻塞 QEventLoop loop; connect(m_pXRayHelp, &SerialPortBase::SigUnitFinished, &loop, &QEventLoop::quit); emit SigUnInit(); loop.exec(); m_pXRayThread->quit(); m_pXRayThread->wait(); return false; } void drive::XRayControl::SetXRayRst() { emit SigXRayRst(); } void drive::XRayControl::SetSyncWarmUp() { } void drive::XRayControl::SetWarmUp() { emit SigXRayWarmUp(); } int drive::XRayControl::SetXRaySwitch(bool bIsOpen) { emit SigSetXRaySwitch(bIsOpen); if (!bIsOpen && m_XRayStatus == XRMS_On) //只有开源后关源才设置成准备就绪 { m_XRayStatus = XRMS_StandBy; } return true; } int drive::XRayControl::SetXRayElectricParams(int nVol, int nCur) { emit SigSetXRayElectricParams(nVol, nCur); return 0; } XRayMonitorStatus drive::XRayControl::GetAutoXRaySts() { XRayMonitorStatus nXRaySts = GetXRayStatus(); switch (nXRaySts) { case XRMS_NeedWarmUp: break; case XRMS_WarmUp: break; case XRMS_StandBy: break; case XRMS_On: break; case XRMS_Protected: { SetXRayRst(); QThread::msleep(1000); nXRaySts = GetXRayStatus(); }break; case XRMS_Failure: case XRMS_TsfOn: case XRMS_LockOn: { QThread::msleep(1000); nXRaySts = GetXRayStatus(); }break; default: break; } return nXRaySts; } XRayMonitorStatus drive::XRayControl::GetXRayStatus() { //重新获取下状态 XRayMonitorMap xRayStatus = GetXRayMonitorMap(); OnXRayStatusChanged(xRayStatus); return m_XRayStatus; } int drive::XRayControl::GetXRayUseTime() { return m_nUseTime; } bool drive::XRayControl::SyncXRayClose(int nTime) { SetXRaySwitch(false); int nWait = 0; while (nWait < nTime) { if (m_nOutVol < 1 && m_nOutCur < 1) { //qDebug(“XRayOpen Wait Time == %d ms”, nWait * XRAY_WAIT_TIME); LOG_DEBUG(“XRay Close Wait Time == %d ms”, nWait * XRAY_WAIT_TIME); //QThread::msleep(XRAY_WAIT_TIME); break; } QThread::msleep(XRAY_WAIT_TIME); nWait++; } if (nWait >= nTime) { return false; } m_XRayStatus = XRMS_StandBy; return true; } bool drive::XRayControl::SyncXRayOpen(int nVol, int nCur, int nTime) { SetXRayElectricParams(nVol, nCur); SetXRaySwitch(true); int nIdx = 0; while (nIdx < nTime) { if (nVol<= (m_nOutVol+1)&&nCur <= (m_nOutCur + 1)) { qDebug(“XRayOpen Wait Time == %d ms”, nIdx*XRAY_WAIT_TIME); break; } QThread::msleep(XRAY_WAIT_TIME); nIdx++; } if (nIdx >= nTime) { return false; } return true; } XRayMonitorMap drive::XRayControl::GetXRayMonitorMap() { return m_pXRayHelp->GetXRayMonitorMap(); } bool drive::XRayControl::AutoMotionReady() { switch (m_XRayStatus) { case XRMS_NeedWarmUp: { emit SigRevFrameData(tr(“C_XRayNeedWarmUp”), false); return false; } case XRMS_WarmUp: { emit SigRevFrameData(tr(“C_XRayWarmUp”), false); return false; } break; case XRMS_StandBy: case XRMS_On: { //射线源状态正常 emit SigRevFrameData(tr(“C_XRayReady”), true); }break; case XRMS_Protected: case XRMS_Failure: case XRMS_TsfOn: case XRMS_LockOn: { //启动失败,射线源连锁关闭 emit SigRevFrameData(tr(“C_XRayLockOn”), false); return false; }break; default: break; } return true; } void drive::XRayControl::GetMonitorParams() { m_pXRayHelp->SendCommand(XRSCH_SAR, 0); } void drive::XRayControl::OnXRayStatusChanged(XRayMonitorMap qMapStatus) { XRayMonitorStatus nStatus = XRMS_NeedWarmUp; for (int i = XRMT_STS; i < XRMT_NUMS; i++) { m_XRayStatusMap[i] = qMapStatus[i]; } if (m_XRayStatusMap[XRMT_STS] == 5 && m_XRayStatusMap[XRMT_SIN] == 1) { nStatus = XRMS_LockOn; } else { nStatus = (XRayMonitorStatus)m_XRayStatusMap[XRMT_STS]; } if (m_nOutVol != m_XRayStatusMap[XRMT_SHV] || m_nOutCur != m_XRayStatusMap[XRMT_SCU] || m_XRayStatus != nStatus) { m_nOutVol = m_XRayStatusMap[XRMT_SHV]; m_nOutCur = m_XRayStatusMap[XRMT_SCU]; m_XRayStatus = nStatus; LOG_DEBUG("XRayMonitorStatus:Sts: %d; vol:%d ; Cur:%d ", m_XRayStatus, m_nOutVol, m_nOutCur); emit SigUpdateXRayStatus(m_XRayStatus, m_nOutVol, m_nOutCur); } if (m_nUseTime != m_XRayStatusMap[XRMT_XST_TIME]) { m_nUseTime = m_XRayStatusMap[XRMT_XST_TIME]; emit SigUpdateXRayUseTime(m_nUseTime); } }讲讲这些代码详细一点,逐行讲解,谢谢喽
10-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值