本文介绍的是QT 多线程 TCP文件接收服务器实例,如果你想深入了解这方面的资料的话,请关注本文末尾,不多说,我们先来看内容。
因为项目需要,需要跨平台编写网络传输程序。
目标:
用户端:linux(arm平台),完成文件的传输
服务器:windows ,使用多线程的文件的接收
实现无线的文件传输功能
用户端程序,用标准的socket完成文件传输的功能,代码如下:
// Linux下网络编程,客户端程序代码
//程序运行参数:
// ./client IPADDRESS PORTNUMBER
// (其中IPADDRESS是服务端IP地址,PORTNUMBER是服务端用于监听的端口)
//
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//用这个my_read()函数代替本来的read()函数原因有以下几点:
//
//ssize_t read(int fd,void *buf,size_t nbyte)
//read函数是负责从fd中读取内容。当读成功时,read返回实际所读的字节数;如果
//返回的值是0,表示已经读到文件的结束了;小于0表示出现了错误。
//
// 1)如果错误为EINTR说明read出错是由中断引起的,继续读。
// 2)如果是ECONNREST表示网络连接出了问题,停止读取。
size_t min(size_t a,size_t b)
{
return( (a
}
ssize_t my_write(int fd,void *buffer,size_t length)
{
size_t bytes_left; //尚未写的文件大小
size_twritesize=4* 1024;
ssize_t written_bytes; //已经写的文件大小
char *ptr;
ptr=buffer;
bytes_left=length;
while(bytes_left>0)
{
//开始写
written_bytes=write(fd,ptr,min(bytes_left,writesize));
//出现了写错误
if(written_bytes<=0)
{
//中断错误,置零重新写
if(errno==EINTR)
written_bytes=0;
//其他错误,退出不写了
else
return(-1);
}
//从剩下的地方继续写
bytes_left-=written_bytes;
ptr+=written_bytes;
}
return(0);
}
: int main(int argc, char *argv[])
{
int sockfd; //通信套接字描述符
char *buffer; //缓冲区
struct sockaddr_in server_addr; //服务器地址结构
struct hostent *host; //主机地址与名称信息结构
int nbytes; //端口号、字节数
FILE *fp; //文件指针
int nfilesize; //文件大小
char str[128]; //文件名
charyes='Y'; //流程控制
struct timeval tpstart,tpend; //用于记录文件传输时间
float timeuse; //文件传输所用时间
char *hostname="127.0.0.1";//主机名/ip地址
intportnumber=4321;//端口号
//提示用户输入完整的命令行参数
if(argc!=3)
{
fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
printf("using defaults:\nhostname: %s\nportnumber: %d\n",hostname,portnumber);
}
//如果利用用户输入的域名无法获得正确的主机地址信息,则退出
if (argc>1)
{
if((host=gethostbyname(argv[1]))==NULL)
{
fprintf(stderr,"Gethostname error\n");
exit(1);
}
}
else
if((host=gethostbyname(hostname))==NULL)
{
fprintf(stderr,"Gethos