塑胶制品塘厦东莞网站建设,衡水哪有做网站的,中国建筑集团有限公司天眼查,中国最大网站建设商红队专题 招募六边形战士队员1.课前回顾unicode编码 字符串 2.界面编程(下)对话框重载消息函数更改对话框同步更改 3.服务端上线#xff0c;下线#xff0c;以及客户端的资源销毁(上)添加socket 变量添加 socket 消息填补config信息创建线程函数 并运行添加Addhost添加 getIt… 红队专题 招募六边形战士队员1.课前回顾unicode编码 字符串 2.界面编程(下)对话框重载消息函数更改对话框同步更改 3.服务端上线下线以及客户端的资源销毁(上)添加socket 变量添加 socket 消息填补config信息创建线程函数 并运行添加Addhost添加 getItemData创建列表节点类ItemData编写构造函数类成员监听线程运行函数监听线程 招募六边形战士队员
一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系
1.课前回顾
#pragma comment(lib,“ws2_32.lib”)
unicode编码 字符串
_T 宏
多字节编码 ----字符集 知识点 项目属性 2.界面编程(下)
对话框
对话框资源 头文件 添加
private:CToolBar m_toolbar;CImageList m_imagelist;CStatusBar m_statusbar;CBitmap m_subbmp[6];CImageList m_mainicon;void UpdateMain(int port);UINT m_port;UINT m_max;UINT m_Sound;CRect m_rect; // 矩形变量 重载消息函数
查看声明 Dlgcpp里// 当客户端大小发生改变 计算差值 客户端内部控件 同步改变
void CExecN0vvDlg::OnSize(UINT nType, int cx, int cy)
{// 基类 对对话框改变CDialog::OnSize(nType, cx, cy);
// 类型等于最小化的 宏if(nType SIZE_MINIMIZED){return;}// TODO: 在此处添加消息处理程序代码CWnd *pWnd; // 窗口类指针pWnd GetDlgItem(IDC_LIST1); //获取控件句柄 条目id// 控件大小操作if(pWnd)//判断是否为空因为对话框创建时会调用此函数而当时控件还未创建{CRect rect,rect_l; //获取控件变化前大小 eg 50x50GetClientRect(rect_l); // 客户区 控件大小pWnd-GetWindowRect(rect);ScreenToClient(rect);rect.right cx; // 把控件大小变换//rect_l 变化前 rect.bottom rect.bottom (rect_l.bottom - m_rect.bottom);pWnd-MoveWindow(rect);//设置控件大小// 重设状态栏 置底RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);}/*else{delete pWnd;}*/GetClientRect(m_rect);// 还是记录初始值} 更改对话框同步更改 初始化时候调用了 updatemain 初始化程序界面 获取客户端程序客户区 界面大小 存放在 m_rect
3.服务端上线下线以及客户端的资源销毁(上)
列表控件 常规对应 socket指针 我们对应一个类指针
启动监听线程 不会发生阻塞状态
添加socket 变量 添加 socket 消息
头文件定义 InitSocket Dlgcpp 加入 bool C你的Dlg::InitSocket() //初始化SOCKET
{WSADATA WSAData; // 初始化WSAStartup(MAKEWORD(2,2), WSAData);SOCKADDR_IN saddr; // 声明结构体// 结构体操作 初始化 s::socket(AF_INET,SOCK_STREAM,0);if(sSOCKET_ERROR){MessageBox(_T(创建连接失败),_T(提示),MB_OK|MB_ICONWARNING);return false;}// 结构体赋值saddr.sin_familyAF_INET;saddr.sin_addr.S_un.S_addrINADDR_ANY;saddr.sin_porthtons(m_port);int nRet;nRet::bind(s,(SOCKADDR *)saddr,sizeof(saddr));if(nRet SOCKET_ERROR){MessageBox(_T(绑定端口失败),_T(提示),MB_OK|MB_ICONWARNING);return false;}// 最大上线主机数量 m_max Wint类型nRetlisten(s,m_max);if(nRet SOCKET_ERROR){MessageBox(_T(监听端口失败),_T(提示),MB_OK|MB_ICONWARNING);return false;}while(1){SOCKET SerSock;SOCKADDR_IN Seraddr; // 结构体int Seraddrsizesizeof(Seraddr);// 接受连接SerSock accept(s,(sockaddr *)Seraddr,Seraddrsize);if (SerSock INVALID_SOCKET){continue;}// 添加主机AddHost(SerSock,Seraddr);}return true;
}
syc系列 winSocket I/O模型
填补config信息 创建线程函数 并运行
为了适配多线程
防止上面的循环死锁 堵塞 所以把初始化操作封装到一个函数内 Dlgcpp // 空指针 传递了一个 当前类的 this指针
DWORD WINAPI C你的Dlg::OninitSocket(LPVOID self) //初始化Socket线程
{// 强制转换C你的Dlg* t (C你的Dlg*)self;t-InitSocket();return 0;
}头文件静态声明static DWORD WINAPI OninitSocket(LPVOID self); 关闭句柄
添加Addhost
void C你的Dlg::AddHost(SOCKET sock,SOCKADDR_IN addr) //添加主机函数
{GetNewItemData(sock,addr);// 每一个主机节点都是一个类的指针 新申请一个类指针return;
}头文件声明
void AddHost(SOCKET sock,SOCKADDR_IN addr);
添加 getItemData void C你的Dlg::GetNewItemData(SOCKET sock,SOCKADDR_IN addr) //获取新的条目数据
{// 条目信息类 指针 并判断 id是否重复CItemData *item;int id; //声明新的idint Count m_list.GetItemCount();if(Count 0){id 0;}else{id 0;for(int i0;iCount;i){item (CItemData*)m_list.GetItemData(i);if(item-m_id id) // 判断是否为这个 id{i 0;id id 1;continue;}}}item NULL;item new CItemData(id,sock,addr,this-m_hWnd);// 声明一个 条目类item-Run();// 最后调用了 run这个函数
}头文件声明
void GetNewItemData(SOCKET sock,SOCKADDR_IN addr);
创建列表节点类 头文件中调用这个类 ItemData编写
构造函数 cpp 方法 条目信息CItemData::CItemData(UINT id,SOCKET sock,SOCKADDR_IN *addr,HWND m_hWnd)
{this-m_id id; // 上线主机id号 删除操作this-m_sock sock; // 消息传递 SOCKADDR_IN *addr 对方ip获取操作this-m_hWnd m_hWnd; // 获取父类指针char *csIP inet_ntoa(addr-sin_addr); // inet_ntoa 获取ip addr结构体m_IP.Format(_T(%s),_T(127.0.0.1));m_Address.Format(_T(未知));if(m_Address.IsEmpty()) // 地理位置信息{m_Address.Format(_T(未知));}
}头文件#pragma onceclass CItemData
{
public:CItemData(UINT id,SOCKET sock,SOCKADDR_IN *addr,HWND m_hWnd);~CItemData(void);UINT m_id;void Run();SOCKET GetSocket();CString m_IP;CString m_Address;CString m_OS;CString m_Ver; // 操作系统版本bool Cam; // 摄像头private: SOCKET m_sock; HWND m_hWnd;static DWORD WINAPI OnListen(LPVOID lp);void OnBeginListen();
};
类成员监听线程
DWORD WINAPI CItemData::OnListen(LPVOID lp)
{CItemData* t (CItemData*)lp;t-OnBeginListen(); // 调用监听线程return 0;
}
运行函数
用多线程手法来运行 监听线程 void CItemData::Run()
{::CloseHandle(CreateThread(0,0,OnListen,(LPVOID)this,0,0));
}
监听线程
监听远程主机信息 操作
发送信息等等
void CItemData::OnBeginListen() //等待完善
{
}