PcShare2005代码阅读(2)
PcShare的上线信息是通过的HTTP协议的GET方式来发送的,所以我们要提取GET的URL(上线信息),先接收完整的HTTP Header,它以"/r/n"结尾,然后提取'/'和"/r/n"之间的上线信息,这个信息经过了BcdToAsc编码,所以需要解码
int AcceptClientMain(SOCKET s,LPCLIENTITEM pData)
{
char ch = 0;
int nlinelen = 0;
char slinedata[8192] = {0};
int ret = 0;
//接收完整Http头
while(1)
{
//接收一个字符
ret = recv(s,&ch,1,0);
if(ret == 0 || ret == SOCKET_ERROR || m_MainValue.m_IsMainExit)
return -1;
//提取数据
slinedata[nlinelen] = ch;
if(nlinelen >= 4 &&
slinedata[nlinelen] == '/n' &&
slinedata[nlinelen - 1] == '/r' &&
slinedata[nlinelen - 2] == '/n' &&
slinedata[nlinelen - 3] == '/r')
break;
if(nlinelen++ > 8000)
return -1;
}
TRACE("%s/n",slinedata);
char* pFlag = strchr(slinedata,'/');
if(pFlag == NULL) return -1;
if(*(pFlag + 1) == '/')
{
pFlag += 2;
pFlag = strchr(pFlag,'/');
if(pFlag == NULL) return -1;
}
pFlag ++;
//取连接类型
char m_sCommand[10] = {0};
memcpy(m_sCommand,pFlag,4);
int m_Command = atoi(m_sCommand);
//查看命令是否合法
if(m_Command > 4999 || m_Command < 3000)
return -1;
//拷贝login数据
AscToBcd((BYTE*)(pFlag + 4), (BYTE*) &pData->m_SysInfo, sizeof(LOGININFO) * 2);
return m_Command;
}
上线信息提取后,根据首字节的COMMAND来判断该socket是干啥用的,是上线用的,还是其他功能用socket
//接收连接线程
UINT WINAPI MyChildThread(LPVOID lPvoid)
{
//交易处理
SOCKET s = (SOCKET) lPvoid;
CLIENTITEM m_ClientItem = {0};
int nCmd = AcceptClientMain(s,&m_ClientItem);
if(nCmd == -1)
closesocket(s);
else if(nCmd == CONN_MAIN) //上线SOCKET
LoginTrans(s,&m_ClientItem);
else //功能SOCKET
InterTrans(s,&m_ClientItem,nCmd);
return 0;
}
上线用的签到socket,在主窗口上显示上线信息
void LoginTrans(SOCKET s, LPCLIENTITEM pData)
{
//回送确认包头信息
if(!SendKeepAlive(s)) return;
//启动套接字关闭事件通知
if(WSAAsyncSelect(s , m_MainValue.m_MainhWnd ,
WM_CLOSEITEM , FD_CLOSE) == SOCKET_ERROR)
{
closesocket(s);
return ;
}
//填充客户信息
sockaddr_in m_addr = {0};
int addrlen = sizeof(sockaddr_in);
getpeername(s,(sockaddr*) &m_addr,&addrlen);
char mTid[9] = {0};
memcpy(mTid, pData->m_SysInfo.ID, 8);
sprintf(pData->m_Title,"%d.%d.%d.%d:%s",
m_addr.sin_addr.S_un.S_un_b.s_b1,
m_addr.sin_addr.S_un.S_un_b.s_b2,
m_addr.sin_addr.S_un.S_un_b.s_b3,
m_addr.sin_addr.S_un.S_un_b.s_b4,
mTid);
pData->m_WorkSocket = s;
//通知主框架建立了连接
if(!SendMessage(m_MainValue.m_MainhWnd ,
WM_ADDCLIENT, (WPARAM) pData , 0))
{
closesocket(s);
}
}
功能用的socket,通过窗口名,绑定到相应的窗口上
void InterTrans(SOCKET s,LPCLIENTITEM pData , int ExecType)
{
//定位窗口唯一标识
sockaddr_in m_addr = {0};
int addrlen = sizeof(sockaddr_in);
getpeername(s,(sockaddr*) &m_addr,&addrlen);
char mTid[9] = {0};
memcpy(mTid, pData->m_SysInfo.ID, 8);
sprintf(pData->m_Title,"%d.%d.%d.%d:%s",
m_addr.sin_addr.S_un.S_un_b.s_b1,
m_addr.sin_addr.S_un.S_un_b.s_b2,
m_addr.sin_addr.S_un.S_un_b.s_b3,
m_addr.sin_addr.S_un.S_un_b.s_b4,
mTid);
//确定命令对应窗口
char m_WndName[256] = {0};
if(ExecType == CONN_FILE_UP || ExecType == CONN_FILE_DL)
{
//文件传输
sprintf(m_WndName,"PCSHELL文件管理-%s",pData->m_Title);
}
else if(ExecType == CONN_FILE_MANA_SEND)
{
sprintf(m_WndName,"PCSHELL文件管理-%s",pData->m_Title);
}
else if(ExecType == CONN_FILE_MANA_RECV)
{
sprintf(m_WndName,"PCSHELL文件管理-%s",pData->m_Title);
if(!SendKeepAlive(s)) return;
}
else if(ExecType == CONN_FILE_FRAM_SEND)
{
sprintf(m_WndName,"PCSHELL屏幕监控-%s",pData->m_Title);
}
else if(ExecType == CONN_FILE_FRAM_RECV)
{
sprintf(m_WndName,"PCSHELL屏幕监控-%s",pData->m_Title);
if(!SendKeepAlive(s)) return;
}
else if(ExecType == CONN_FILE_TLNT_SEND)
{
sprintf(m_WndName,"PCSHELL超级终端-%s",pData->m_Title);
}
else if(ExecType == CONN_FILE_TLNT_RECV)
{
sprintf(m_WndName,"PCSHELL超级终端-%s",pData->m_Title);
if(!SendKeepAlive(s)) return;
}
else if(ExecType == CONN_FILE_REGD_SEND)
{
sprintf(m_WndName,"PCSHELL注册表管理-%s",pData->m_Title);
}
else if(ExecType == CONN_FILE_REGD_RECV)
{
sprintf(m_WndName,"PCSHELL注册表管理-%s",pData->m_Title);
if(!SendKeepAlive(s)) return;
}
else if(ExecType == CONN_FILE_PROC_SEND)
{
sprintf(m_WndName,"PCSHELL进程管理-%s",pData->m_Title);
}
else if(ExecType == CONN_FILE_PROC_RECV)
{
sprintf(m_WndName,"PCSHELL进程管理-%s",pData->m_Title);
if(!SendKeepAlive(s)) return;
}
else if(ExecType == CONN_FILE_SERV_SEND)
{
sprintf(m_WndName,"PCSHELL服务管理-%s",pData->m_Title);
}
else if(ExecType == CONN_FILE_SERV_RECV)
{
sprintf(m_WndName,"PCSHELL服务管理-%s",pData->m_Title);
if(!SendKeepAlive(s)) return;
}
else if(ExecType == CONN_FILE_MULT_SEND)
{
sprintf(m_WndName,"PCSHELL视频监控-%s",pData->m_Title);
}
else if(ExecType == CONN_FILE_MULT_RECV)
{
sprintf(m_WndName,"PCSHELL视频监控-%s",pData->m_Title);
if(!SendKeepAlive(s)) return;
}
Sleep(500);
//查找窗口
HWND hWnd = FindWindow(NULL,m_WndName);
if(hWnd == NULL)
{
Sleep(2000);
hWnd = FindWindow(NULL,m_WndName);
if(hWnd == NULL)
{
closesocket(s);
return;
}
}
//拷贝套接字
DWORD pId = 0;
GetWindowThreadProcessId(hWnd, &pId);
WSAPROTOCOL_INFO m_SocketInfo = {0};
if(WSADuplicateSocket(s, pId , &m_SocketInfo))
{
closesocket(s);
return ;
}
//发送套接字到进程
COPYDATASTRUCT ct = {0};
ct.lpData = &m_SocketInfo;
ct.cbData = sizeof(WSAPROTOCOL_INFO);
ct.dwData = ExecType;
SendMessage(hWnd,WM_COPYDATA,0,(LPARAM) &ct);
closesocket(s);
}
PcShare也山寨
PcShare2005代码阅读(2)相关推荐
- ORB_SLAM2代码阅读(5)——Bundle Adjustment
ORB_SLAM2代码阅读(5)--Bundle Adjustment 1. 说明 2. Bundle Adjustment(BA)的物理意义 3. BA的数学表达 4. BA的求解方法 4.1 最速 ...
- ORB_SLAM2代码阅读(3)——LocalMapping线程
ORB_SLAM2代码阅读(3)--LocalMapping线程 1.说明 2.简介 3.处理关键帧 4. 地图点剔除 5. 创建新的地图点 6.相邻搜索 6.剔除冗余关键帧 1.说明 本文介绍ORB ...
- ORB_SLAM2代码阅读(4)——LoopClosing线程
ORB_SLAM2代码阅读(4)--LoopClosing线程 1.说明 2.简介 3.检测回环 4.计算Sim3 4.1 为什么在进行回环检测的时候需要计算相似变换矩阵,而不是等距变换? 4.2 累 ...
- ORB_SLAM2代码阅读(2)——tracking线程
ORB_SLAM2代码阅读(2)--Tracking线程 1. 说明 2. 简介 2.1 Tracking 流程 2.2 Tracking 线程的二三四 2.2.1 Tracking 线程的二种模式 ...
- ORB_SLAM2代码阅读(1)——系统入口
ORB_SLAM2代码阅读(1)--系统简介 1.说明 2.简介 3.stereo_kitti.cc 4.SLAM系统文件(System.cc) 4.1 构造函数System() 4.2 TrackS ...
- 深度学习项目代码阅读建议
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|机器学习实验室 犹豫很久要不要把读代码这个事情专门挑出来写 ...
- JavaScript权威Douglas Crockford:代码阅读和每个人都该学的编程
作者:Peter Seibel 关于JavaScript Seibel:在程序学习之路上有哪些令你后悔的事情? Crockford:我了解一些语言,但却一直没有机会使用.我花了不少时间学习APL并了解 ...
- MFC按钮CXPButton类,代码阅读起来还是挺不错的
在操手MFC的时候,经常会抱怨MFC界面不如其他的框架或语言,比如VB,C#等等,面对MS在系统上的不断更新换代,我们也越来越追求软件的视觉效果,譬如我们会更喜欢win7下的玻璃效果,看起来很炫. 在 ...
- 《代码阅读方法与实践之读书笔记之一》
<代码阅读方法与实践之读书笔记之一> 阅读代码是程序员的基本技能,同时也是软件开发.维护.演进.审查和重用过程中不可或缺的组成部分.<代码阅读方法与实践之读书笔记之一>这本书围 ...
- 《代码阅读方法与实践》阅读笔记一
第三本书我选择了代码阅读方法与实践,说实话,觉得三本书里面最好的就是这一本书了,每一段话,每一段代码打偶让我受益匪浅.下面是我的收获: 1.1为什么以及如何阅读代码 将代码作为文献:要养成一个习惯, ...
最新文章
- LeetCode946-验证栈序列
- python游戏编程入门下载-Python游戏编程入门 中文pdf扫描版|网盘下载内附地址提取码|...
- 「力扣」509. 斐波那契数【动态规划】详解!
- 英国电信推出FTTP和G.fast新试点项目
- BilSTM 实体识别_“万创杯”中医药天池大数据竞赛——中药说明书实体识别挑战的一点感受...
- 百度年龄计算机在线使用,百度年龄计算器app
- 终结解决方案之最:struts2整合jasperreport再现图片无法显示
- 【BZOJ5285】【HNOI2018】寻宝游戏
- Hack The Box——Academy
- equal和==的区别
- java软电话_软电话使用呼叫中心的方法与流程
- 中国移动集团史正军:论支付能力的重要意义及我们要发展什么样的支付?
- 2021年英语六级翻译
- android manifest相关属性
- 大数据建模 需要了解的八大定律
- 基于SSM框架的图书馆借阅管理系统
- 图片聚类——k-means算法的python实现
- 用友T6显示连接服务器出错,用友T6软件“无法连接到服务器”,出现提示:“运行时错误‘48’:文件未找到:Client.Dll”...
- DWL-2100AP 默认登录帐号密码
- el-from表单验证(数字,中文,手机号,邮箱,英文)