中心处理模块
中心处理模块,负责进行对网络模块接受的数据进行分析,并通过信号和槽机制通知ui界面等模块进行操作
#include "kernel.h"
#include"QDebug"
Kernel::Kernel(QObject *parent)
: QObject{parent}
{
m_TCPnet=new TCPnet(this);
m_server=new Server(this);
}
Kernel::~Kernel()
{
delete m_TCPnet;
delete m_server;
}
bool Kernel::connect(const char *szip, short port)
{
if(!m_TCPnet->connectServer(szip,port))return false;
if(!m_server->initNetWork("127.0.0.1",8899))return false;
return true;
}
void Kernel::disconnect(const char *error)
{
m_TCPnet->disconnect(error);
m_server->unitNetWork(error);
}
bool Kernel::sendData(const char *buf, int size)
{
if(m_TCPnet->sendData(buf,size))return true;
return false;
}
void Kernel::deal_data(const char *buf)
{
switch(*buf){
case _default_protocol_register_rs:
emit signal_regist((STRU_REGISER_RS *)buf);
break;
case _default_protocol_login_rs:
emit signal_log_in((STRU_LOGIN_RS*)buf);
break;
case _default_protocol_getfilelist_rs:
emit signal_get_file((STRU_GETFILELIST_RS*)buf);
break;
case _default_protocol_sendfileinfo_rs:
emit signal_get_file_res((STRU_FILEINFO_RS*)buf);
break;
case _default_protocol_sharelink_rs:
emit signal_share_link((STRU_SHARELINK_RS*)buf);
break;
case _default_protocol_getlink_rs:
emit signal_get_link((STRU_GETLINK_RS*)buf);
break;
}
}
void Kernel::deal_html(const char *buf)
{
QString str=buf;
qDebug()<<str;
str=str.section("text=",-1);
qDebug()<<str;
emit signal_html(str);
}
网络处理模块
网络处理模块,这里采用了TCP去进行连接,创建 连接 发送以及接收数据,并将接受的数据交给控制模块去处理,向外提供一个虚基类指针负责使用模块内部分函数
#include "tcpnet.h"
TCPnet::TCPnet(IKernel * kernel) {
m_flag=true;
customer=0;
net_kernel=kernel;
}
TCPnet::~TCPnet()
{
}
bool TCPnet::connectServer(const char *szip, short port)
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
printf("WSAStartup failed with error: %d\n", err);
return false;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
disconnect("Could not find a usable version of Winsock.dll\n");
return false;
}
else
printf("The Winsock 2.2 dll was found okay\n");
customer=socket(AF_INET,SOCK_STREAM,0);
if(customer== INVALID_SOCKET){
disconnect("socket_error");
return false;
}
sockaddr_in idear;
int size=sizeof(idear);
idear.sin_port=htons(port);
idear.sin_family=AF_INET;
idear.sin_addr.S_un.S_addr=inet_addr(szip);
if(SOCKET_ERROR==connect(customer,(struct sockaddr*)&idear,size)){
disconnect("connnect_error");
return false;
}
m_thread=CreateThread(0,0,&threadproc,this,0,0);
return true;
}
DWORD TCPnet::threadproc(LPVOID lpvoid){
TCPnet *pthis=(TCPnet *) lpvoid;
pthis->recvData();
return 0;
}
void TCPnet::disconnect(const char * err