目录
源码链接
功能介绍
1.网络连接
这里只是客户端,首先需要连接服务端
bool conneet::Conneet(QString ip,int port)
{
fd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == fd)
{
return false;
}
addr.sin_addr.s_addr = inet_addr(ip.toLatin1().data());
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
if(-1 == ::connect(fd,(struct sockaddr*)&addr,sizeof (addr)))
{
perror("连接失败");
return false;
}
return true;
}
使用socket进行连接,是否成功返回一个标志位
2.读写线程
因为需要间断的进行读写,并且无法确定什么时候进行读写,所以这里封装了两条线程进行这两个任务
void WriteThread::run()
{
int res = 0;
while(true)
{
if(len != 0)
{
qDebug() << len;
res = write(conneet::getmyconneet()->getFd(),buf,len);
qDebug() << res;
bzero(buf,sizeof (buf));
len = 0;
}
}
}
void WriteThread::sendLogin(QString name, QString pwd)
{
HEAD myHead = {0};
LOGIN myLogin = {0};
myHead.bussinessType = 1;
myHead.bussinessLength = sizeof (LOGIN);
memcpy(myHead.cheakCoke,"abc",sizeof (myHead.cheakCoke));
memcpy(myLogin.account,name.toStdString().c_str(),sizeof (myLogin.account));
memcpy(myLogin.pwd,pwd.toStdString().c_str(),sizeof (myLogin.pwd));
memcpy(buf,&myHead,sizeof (HEAD));
memcpy((void *)(buf + sizeof (HEAD)),&myLogin,sizeof (LOGIN));
len = sizeof (HEAD) + sizeof (LOGIN);
}
这里是写线程,通过槽函数触发比如这里的sendLogin,在更新len后run中条件达成进进行发送
读线程也是类似,接收到信息通过信号槽机制传输出去
3.文件的分割
因为涉及到图片的传输,所以这里需要用到分割(建议不要传输png,我这里测试传输很慢)
主要思路:分割 ----》 传送 -----》 失败重传
分割部分
char buf[1000] = {0};
int fd;
int num = 1;