#include "filetranseceiver.h" #include #include #include FileTranseceiver::FileTranseceiver() { // struct sockaddr_in server_addr; // bzero(&server_addr, sizeof(server_addr)); // 置字节字符串前n个字节为0,包括'\0' // server_addr.sin_family = AF_INET; // server_addr.sin_addr.s_addr = htons(INADDR_ANY); // 转小端,INADDR_ANY就是指定地址为0.0.0.0的地址 // server_addr.sin_port = htons(5000); serverThead = NULL; sockfd = socket(PF_INET, SOCK_STREAM, 0); struct sockaddr_in seraddr; seraddr.sin_family = AF_INET; seraddr.sin_port = htons(5001); seraddr.sin_addr.s_addr = htons(INADDR_ANY); int tmp = 1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &tmp, sizeof(int)); if(bind(sockfd,(struct sockaddr *)&seraddr,sizeof(seraddr)) == -1) { qDebug() << "tftp server bind error"; return; } if(listen(sockfd,5) == -1) { qDebug() << "listen error"; return; } serverThead = new QThread(); moveToThread(serverThead); QObject::connect(serverThead, SIGNAL(started()), this, SLOT(connectListen())); //connect(&m_thread, SIGNAL(finished()), this, SLOT(deleteLater())); // serverThead->start(); // qDebug()<<"tftp server on..."; } FileTranseceiver::~FileTranseceiver(void) { if(serverThead) { disconnect(serverThead, SIGNAL(started()), this, SLOT(connectListen())); if (serverThead->isRunning()) { serverThead->quit(); serverThead->wait(); } } if(connfd) close(connfd); if(sockfd) close(sockfd); } void FileTranseceiver::start() { if(serverThead) { serverThead->start(); } qDebug()<<"tftp server on..."; } void FileTranseceiver::connectListen() { struct msg info; struct sockaddr_in cliaddr; int len = sizeof(cliaddr); pid_t pid; int n; QString fileName; do { connfd = accept(sockfd,(struct sockaddr *)&cliaddr,(socklen_t *)&len); if(connfd == -1) { qDebug() << "accept"; continue; } // pid = fork(); // if(pid == -1) // { // qDebug() << "fork"; // continue; // } // else if(pid == 0) { //close(sockfd); while(1) { n = recv(connfd,&info,sizeof(info),0); if(n == -1) { qDebug() << "recv"; //exit(EXIT_FAILURE); break; } if(n == 0) { qDebug() << "客户端退出"; //exit(EXIT_SUCCESS); break; } switch(info.type) { // case SEARCH: // search_serverdir(connfd,info); // break; case DOWN: ftp_download(connfd,info); break; case UP: upload_ftp(connfd,info); fileName = QString(info.fname); qDebug()<<"emit fileRecieved(fileName)"; emit fileRecieved(fileName); break; default: break; } } close(connfd); } // else // { // close(connfd); // } } while(1); } //将某文件中的内容传给客户端 int FileTranseceiver::ftp_download(int connfd,struct msg info) { FILE *fp; char name[100]; memset(name,0,100); sprintf(name, DOC_DIR"/%s",info.fname); // QFile dl_file(QString::fromUtf8(name)); // if (!dl_file.exists()) { // return -1; // } //qDebug()<<"receive file name:"<