示例#1
0
int main ()
{
	freopen ( "vraji.in","r",stdin ) ;
	freopen ( "vraji.out","w", stdout) ;
	
	int n , x , y , S = 0 , cmmdc , i ;
	
	scanf ( "%d", & n ) ;
	
	scanf ( "%d%d", & x, & y ) ;
	S = x*y ;
	cmmdc = x*y ;
	
	for ( i = 2 ; i <= n ; ++ i )
	{
		scanf ( "%d%d", &x,&y ) ;
		if ( x*y > S )
			S=x*y;
		cmmdc = cmmd ( cmmdc , x*y ) ;
	}
	printf ( "%d\n%d", S , cmmdc ) ;
	return 0 ;
}
示例#2
0
//Start the peer server
void * FileServices::peerServer(void * arg) {
//std::cout << "Starting to listen " << std::endl;
	initialize();
	int sent, newsockfd, oldtype;
	struct hostent *serv_addr;
	struct sockaddr_in server;
	server.sin_family = AF_INET;
	server.sin_addr.s_addr = INADDR_ANY;
	server.sin_port = htons(10090);

	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);

	//create a socket
	if((serverSock = socket( AF_INET, SOCK_STREAM, 0)) == -1) {
		std::cout << "PeerServer socket call failed" << std::endl;
	}	
	
	//bind the socket
	if((bind(serverSock, (struct sockaddr *)&server, sizeof(server))) == -1) {
		std::cout << "PeerServer Bind Call failed" << std::endl;
	}

	//Start Listening to connections
	if(listen(serverSock, 5) == -1) {
		std::cout << "PeerServer Listen call failed" << std::endl;
	}
	while(keepalive == 1) {
			
	//Accept connection
		if((newsockfd = accept(serverSock, NULL, NULL)) == -1) {
			std::cout << "PeerServer Accept call failed " << std::endl;

		}	
			if(fork() == 0) {
			std::cout << "New Request! " << std::endl;
			int request,rec, sent;
			rec = recv(newsockfd, &request, sizeof(int), 0);
			if(rec == -1) {
				std::cout << "Receive error " << std::endl;
			}
		std::cout << "Request type " << request << std::endl;
			//Switch on the request type
			switch(request) {
				case 0: {
				//Read file request
					std::cout << "New file read request " << std::endl;
					int fnameSize, ver, recvd, bypass, reqver, mode;
					char fname[] = " ";
					char fdir[] = " ";
					char vers[] = " ";
					std::string fdirV;
					rec = recv(newsockfd, &fnameSize, sizeof(size_t), 0);
					rec = recv(newsockfd, fname, fnameSize, 0); //Assume it already has the file
					rec = recv(newsockfd, &mode, sizeof(int), 0);
					rec = recv(newsockfd, &reqver, sizeof(int), 0);
				
					if(mode == 0)
						strcpy(fdir, "home/current/");
					else
						strcpy(fdir, "home/stable/");
					strcat(fdir,fname);
					std::string dirc(fdir);
					fdirV.append(dirc);	
					ver = getVersion(fname);	
					sent = send(newsockfd, &ver, sizeof(int), 0);
				
					rec = recv(newsockfd, &bypass, sizeof(int), 0);				
					sprintf(vers, "%d", reqver);	
					FILE *pFile;
					char buf[65536], fname1[100];
					int fileSize, n_chunks;			
					pFile = fopen(dirc.c_str(), "rb");
					if(bypass == 0) {
			
	
						if(mode == 2 && reqver != 0) {
							fdirV.append(".");
							fdirV.append(vers);
							pFile = fopen(fdirV.c_str(), "rb");
							if(pFile == NULL) {
								pFile = fopen(dirc.c_str(), "rb");
							}
							else {
							}
						}

						std::cout <<"File "<< fdirV <<" is requested." << std::endl;
						fseek(pFile, 0, SEEK_END);
						fileSize = ftell(pFile);
						rewind(pFile);
						sent = send(newsockfd, &fileSize, sizeof(int), 0);
						fread(buf,1, fileSize,pFile);
						fclose(pFile);
						sent = send(newsockfd, buf, fileSize, 0);
						std::cout << "File " << fname <<"  is sent" << std::endl;
					}
					else {
						std::cout << "File not sent, already the version is latest " << std::endl;
					}
					close(newsockfd);
					break;	
					}
				case 1: {
				//Write file request
					std::cout << "New file write request " << std::endl;
					int fnameSize, recvd, fileSize;
					char fname[20];
					char fdir[20] = "home/current/";
					rec = recv(newsockfd, &fnameSize, sizeof(size_t), 0);
					rec = recv(newsockfd, fname, fnameSize, 0); //Assume it already has the file
					strcat(fdir,fname);
					FILE *pFile;
					char buf[65536];
					recvd = recv(newsockfd, &fileSize, sizeof(int), 0);
					recvd = recv(newsockfd, buf, fileSize, 0);
					pFile = fopen(fdir, "w");
					fwrite(buf, 1, fileSize, pFile);
					fclose(pFile);
					close(newsockfd);	
					std::cout <<"File "<< fdir <<" is updated." << std::endl;
					break;
					}
				case 2: {
				//Commit file to stable version
					initialize();
					std::cout << "A new commit request" << std::endl;
					int fnameSize, recvd, fileSize;
					char fname[] = " ";
					char fdir1[] = "home/current/";
					char fdir2[] = "home/stable/";
					char space[] = " ";

					char dot[] = ".";
					rec = recv(newsockfd, &fnameSize, sizeof(int), 0);
					rec = recv(newsockfd, fname, fnameSize, 0); //Assume it already has the file

					Files *file = new Files;
					file = getFileinfo(fname);
				
					strcat(fdir1,fname);
					strcat(fdir2,fname);
	
					char command[] = " ";	
					char cmd[] = "cp ";
					strcat(command, cmd);
					strcat(command, "home/current/");
					strcat(command, fname);
					strcat(command, space);
					strcat(command, "home/stable/");
					strcat(command, fname);
					std::string cmmd(command);
					char ver[] = " ";
					sprintf(ver, "%d", file->version);	
					char mvcmd[] = " ";
					char mv[] = "mv ";
					strcat(mvcmd, mv);
					strcat(mvcmd, fdir2);
					strcat(mvcmd, space);
					strcat(mvcmd, fdir2);
					strcat(mvcmd, dot);
					strcat(mvcmd, ver);
					system(mvcmd);
					system(cmmd.c_str());				
					file->version++;
					updatefilelist();

					close(newsockfd);
					break;
				}
				case 3: {
				//New file being added to the VFS
					std::cout << "New file is added to the PeerBook" << std::endl;
					int fnameSize;	
					char fname[] = " ";
					rec = recv(newsockfd, &fnameSize, sizeof(int), 0);
					rec = recv(newsockfd, fname, fnameSize, 0); //Assume it already has the file
	
					char client_IP[20];
					struct sockaddr_in client;
					socklen_t len = sizeof(client);		
					if(getpeername(newsockfd, (struct sockaddr*)&client, &len) == -1) {
						std::cout << "Cannot get IP of Client" << std::endl;
					}
					inet_ntop(AF_INET, &client.sin_addr, client_IP, sizeof(client_IP));	
			
					try {
						std::ofstream outfile ("fileslist", std::ofstream::out | std::ofstream::app);	
						outfile << fname << " " << client_IP << " 10090 " << "0 " << "0 " << "0 " << std::endl;
					}
					catch (std::ofstream::failure e) {
    					std::cout << "Exception opening/reading/closing file" << std::endl;
					}
					break;
				}	
				default: {
					std::cout << "Illegal request" << std::endl;
					break;
				}
			}
			close(newsockfd);
		}	
	
   	}
	close(serverSock);			  
	//pthread_exit(NULL);	
}