Пример #1
0
void get_server(receiver_param *rp, struct frame_t *frame_info)
{
    error_code_t e;
    FILE *stream;
    long file_size;

    stream = fopen(frame_info->data, "r");
    if(!stream)
    {
        if(errno == EACCES)
            send_error(rp->source_sd, NO_PERMISSION, 0);
        else if (errno == ENOENT)
            send_error(rp->source_sd, NO_FILE, 0);
        return;
    }
        
    file_size = get_file_size(stream);
    e = send_d(rp, (char*)&file_size, sizeof(long), 0);
    if(e != OK)
    {
        fclose(stream);
        return;
    }

    file_transfer(rp, stream, 1, file_size);
    fclose(stream);
}
Пример #2
0
error_code_t put(receiver_param *rp, const char *command) // ou sd ao invez do rp
{
    char *file_name;
    unsigned char name_size;
    long file_size;
    error_code_t e;
    FILE *stream;

    if (command[3] != ' ' && command[3] != '\0')
        return INV_CMD;
    
    file_name = (char*)&command[4];

    name_size = (unsigned char)strlen(file_name);

    if (name_size > DATA_MAX_SIZE)
        return BIG_NAME;

    stream = fopen(file_name, "r");
    if (!stream)
    {
        switch (errno)
        {
        case EACCES:
            return NO_PERMISSION;
        case ENOENT:
            return NO_FILE;
        }        
    }

    e = remote_command(rp, 'P', file_name, name_size, NULL);
    if (e != OK)
    {
        fclose(stream);
        return e;
    }

    file_size = get_file_size(stream); // tamanho do arquivo

    e = send_d(rp, (char*)&file_size, sizeof(long), 1); // talvez colocar mais coisas que o tamanho do arquivo
    if (e != OK)
    {
        fclose(stream);
        return e;
    }

    file_transfer(rp, stream, 2, file_size);
    
    fclose(stream);

    return OK;
}
int main(int argc, char *argv[])
{
	int portno = atoi(argv[1]); // we got the port through it
	file_transfer(portno);
    // char c;
    // while(scanf("%c",&c)!=EOF){
    //     switch(c){
    //         case '\n':
    //         //
    //         break;
    //         case 
    //     }
    // }
    return 0; 
     
}
Пример #4
0
//连接后调用
void start_connet(struct client_info *client_info)
{
	int ret=0;
	int fd=client_info->fd;
//	printf("some one connect in...\nhis ip is %s",inet_ntoa(client_info->sockaddr->sin_addr));
	ret=file_transfer(client_info->fd,file_path);
	if(ret<0)
	{
		printf("file receive error. exit\n");
		exit(-1);
	}

	printf("transfer successfully... \n");



}
Пример #5
0
// Define main() function for stage 1 of the communication.
int main(int argc, char *argv[])
{
	int sockfd, new_fd;  // Listen on sock_fd, new connection on new_fd.
	struct addrinfo hints, *servinfo, *p;
	struct sockaddr_storage their_addr; // Client's address information.
	socklen_t sin_size;
	struct sigaction sa;
	int yes=1;
	char s[INET6_ADDRSTRLEN]; // Variable to store the string representation of the client's IP address.
	int rv;

	char buf[10000];
	int numbytes;

	int n_port = atoi(argv[1]);
	
	if ((n_port < 1024) || (n_port > 65535)) {
		fprintf(stderr, "n_port must be between 1024 and 65535.");
		return 1;
	}
	
	// Generate random port number for the stage 2 of the communication - transaction using UDP sockets.
	srand (time(NULL));
	int r_port = (rand() % 64512) + 1024;

	memset(&hints, 0, sizeof hints);
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_flags = AI_PASSIVE; // use my IP

	// Get the address info of the client.
	if ((rv = getaddrinfo(NULL, argv[1], &hints, &servinfo)) != 0) {
		fprintf(stderr, "getaddrinfo() error: %s.", gai_strerror(rv));
		return 1;
	}

	// Loop through all the results and bind to the first client.
	for(p = servinfo; p != NULL; p = p->ai_next) {
		if ((sockfd = socket(p->ai_family, p->ai_socktype,
						p->ai_protocol)) == -1) {
			perror("socket() error.");
			continue;
		}

		if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,
					sizeof(int)) == -1) {
			perror("setsockopt() error.");
			exit(1);
		}

		if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
			close(sockfd);
			perror("bind() error.");
			continue;
		}

		break;
	}

	// Free the address info variables retrieved.
	freeaddrinfo(servinfo); 

	if (p == NULL)  {
		fprintf(stderr, "Server failed to bind.");
		exit(1);
	}

	if (listen(sockfd, 10) == -1) {
		perror("listen() error.");
		exit(1);
	}

	sa.sa_handler = sigchld_handler; // Reap all dead processes.
	sigemptyset(&sa.sa_mask);
	sa.sa_flags = SA_RESTART;
	if (sigaction(SIGCHLD, &sa, NULL) == -1) {
		perror("sigaction() error.");
		exit(1);
	}

	while(1) {  // Main loop.
		sin_size = sizeof their_addr;
		new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size); // Accept connection from the client.
		if (new_fd == -1) {
			perror("accept() error.");
			continue;
		}

		// Store the readable IP address of the client in variable s.
		inet_ntop(their_addr.ss_family,
		get_in_addr((struct sockaddr *)&their_addr),
		s, sizeof s);

		while(1) {

			// Connection error.
			if ((numbytes = recv(new_fd, buf, sizeof(buf), 0)) == -1) {
				perror("recv() error.");
				exit(1);
			}

			// Client connection closed.
			else if (numbytes == 0) {
				printf("Connection closed.\n"); // Server still listening to other connections
				break;
			}

			// Connection success.
			printf("\nNegotiation detected. Selected random port %d\n\n", r_port);

			// Send r_port to the client.
			if ((send(new_fd, &r_port, sizeof(int), 0)) == -1) {
				fprintf(stderr, "Sending r_port failed.\n");
			}
			close(new_fd); // Close the TCP connection with the client.
			break;

		}
		
		// Negotiation phase (stage 1) complete. Move to UDP transaction.
		file_transfer(r_port);
		break;
	
	}
	return 0; // Return from the function.
}
void parse_command(char option[]) {
	int registerfd, consock;
	char server_ip[15], dest[100], filename[100], file1[100], file2[100],
			file3[100];

	char *token;
	char para1[50], para2[50], para3[50];
	int conid1 = 0, conid2 = 0, conid3 = 0, server_port, con_port, tid, uid;
	const char s[2] = " ";
	//parsing work

	token = strtok(option, s);
	if ((strcmp(token, "REGISTER") == 0) || (strcmp(token, "register") == 0)) {

		token = strtok(NULL, s);
		if (token == NULL) {
			fprintf(stderr,
					"\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n");
			return;
		}
		strcpy(para1, token);
		token = strtok(NULL, s);
		if (token == NULL) {
			fprintf(stderr,
					"\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n");
			return;
		}
		strcpy(para2, token);

		server_port = atoi(para2);

		strcpy(server_ip, para1);
		if (strcmp("128.205.36.8", server_ip) != 0) {
			fprintf(stderr, "\nSERVER IP INCORRECT\n");

		} else {

			registerfd = register_serv(server_ip, server_port);
			FD_SET(registerfd, &readfds);

		}
	} else if ((strcmp(token, "CONNECT") == 0)
			|| (strcmp(token, "connect") == 0)) {
		token = strtok(NULL, s);
		if (token == NULL) {
			fprintf(stderr,
					"\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n");
			return;
		}
		strcpy(dest, token);
		token = strtok(NULL, s);
		if (token == NULL) {
			fprintf(stderr,
					"\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n");
			return;
		}
		con_port = atoi(token);

		consock = connect_client(dest, con_port);
		if (consock == -1)
			fprintf(stderr, "\nIMPROPER CONNECTION\n");
		else
			FD_SET(consock, &readfds);

	}

	else if ((strcmp(token, "UPLOAD") == 0) || (strcmp(token, "upload") == 0)) {
		token = strtok(NULL, s);
		if (token == NULL) {
			fprintf(stderr,
					"\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n");
			return;
		}
		uid = atoi(token);
		token = strtok(NULL, s);
		if (token == NULL) {
			fprintf(stderr,
					"\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n");
			return;
		}
		strcpy(filename, token);
		fprintf(stderr, "\nUPLOADING FILE %s TO CONNECTION %d", filename, uid);

		if (uid == 1) {
			fprintf(stderr, "\nUPLOAD TO SERVER NOT ALLOWED\n");

		}

		else {
			int i;
			for (i = 1; i < 4; i++) {
				if (mycon[i].con_id == uid)
					break;

			}
			if (i == 4) {
				fprintf(stderr, "\nNO SUCH CONNECTION\n");
			}

			else {

				int val = file_transfer(mycon[i].confd, filename);
				if (val == -1)
					fprintf(stderr, "\n\nERROR IN FILE TRANSFER\n\n");

			}

		}
	}

	else if ((strcmp(token, "DOWNLOAD") == 0)
			|| (strcmp(token, "download") == 0)) {
		token = strtok(NULL, s);
		if (token == NULL) {
			fprintf(stderr,
					"\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n");
			return;
		}
		conid1 = atoi(token);
		token = strtok(NULL, s);
		if (token == NULL) {
			fprintf(stderr,
					"\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n");
			return;
		}
		strcpy(file1, token);
		token = strtok(NULL, s);
		if (token != NULL) {
			conid2 = atoi(token);
			token = strtok(NULL, s);
			if (token != NULL) {
				strcpy(file2, token);
				token = strtok(NULL, s);
				if (token != NULL) {
					conid3 = atoi(token);
					token = strtok(NULL, s);
					if (token != NULL) {
						strcpy(file3, token);
					} else {
						fprintf(stderr, "\nINCORRECT COMMAND\n");
					}
				}
			} else {
				fprintf(stderr, "\nINCORRECT COMMAND");
			}

		}

		if ((conid1 == 1) || (conid2 == 1) || (conid3 == 1)) {
			fprintf(stderr, "\nDOWNLOAD FROM SERVER NOT ALLOWED\n");
			if (conid1 == 1)
				conid1 = 0;
			else if (conid2 == 1)
				conid2 = 0;
			else
				conid3 = 0;
		}

		if (conid1 != 0) {
			fprintf(stderr, "\nDOWNLOADING FILE %s FROM CONNECTION %d\n", file1,
					conid1);
			int val = download_file(file1, conid1);
			if (val == -1)
				fprintf(stderr, "ERROR IN FILE TRNSFER %s", file1);
		}
		if (conid2 != 0) {
			fprintf(stderr, "\nDOWNLOADING FILE %s FROM CONNECTION %d\n", file2,
					conid2);
			int val = download_file(file2, conid2);
			if (val == -1)
				fprintf(stderr, "ERROR IN FILE TRNSFER %s", file1);
		}
		if (conid3 != 0) {
			fprintf(stderr, "\nDOWNLOADING FILE %s FROM CONNECTION %d\n", file3,
					conid3);
			int val = download_file(file3, conid3);
			if (val == -1)
				fprintf(stderr, "ERROR IN FILE TRNSFER %s", file1);
		}

	}

	else if ((strcmp(token, "TERMINATE") == 0)
			|| (strcmp(token, "terminate") == 0)) {
		token = strtok(NULL, s);
		if (token == NULL) {
			fprintf(stderr,
					"\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n");
			return;
		}
		tid = atoi(token);
		fprintf(stderr, "\n TERMINATING CONNECTION ID %d\n", tid);
		terminate_con(tid);

	} else if ((strcmp(token, "EXIT") == 0) || (strcmp(token, "exit") == 0)) {

		fprintf(stderr, "\nEXITING.....\n");
		exit(1);

	}

	else if ((strcmp(token, "MYPORT") == 0) || (strcmp(token, "myport") == 0)) {

		fprintf(stderr, "\nMY PORT IS:%d\n", PORTNO);

	} else if ((strcmp(token, "LIST") == 0) || (strcmp(token, "list") == 0)) {

		display_con();

	}

	else if ((strcmp(token, "CREATOR") == 0)
			|| (strcmp(token, "creator") == 0)) {
		fprintf(stderr,
				"\nCREATOR:Pratik Gajanan Deshpande\npdeshpan\[email protected]\n");

	}

	else if ((strcmp(token, "MYIP") == 0) || (strcmp(token, "myip") == 0)) {
		myipis();
		fprintf(stderr, "\nMY IP IS:%s\n", myip);

	} else if ((strcmp(token, "HELP") == 0) || (strcmp(token, "help") == 0)) {
		help();

	} else {
		fprintf(stderr, "\nINCORRECT COMMAND PLEASE TYPE 'HELP' IF REQUIRED\n");
	}

}
void client() {

	int consock, registerfd, server_sockfd, client_sockfd;
	int server_len, client_len;
	struct sockaddr_in server_address;
	struct sockaddr_in client_address;
	int result;
	char option[1024];

	// consock=connect_client(2);
	server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
	server_address.sin_family = AF_INET;
	server_address.sin_addr.s_addr = htonl(INADDR_ANY);
	server_address.sin_port = htons(PORTNO);
	server_len = sizeof(server_address);
	bind(server_sockfd, (struct sockaddr *) &server_address, server_len);
	listen(server_sockfd, 5);

	//initializing readfds to sockfd.
	FD_ZERO(&readfds);

	FD_SET(server_sockfd, &readfds);

	FD_SET(0, &readfds);

	while (1) // waiting for client requests
	{

		int fd;

		int nread;
		char ch[1024];

		testfds = readfds;

		result = select(FD_SETSIZE, &testfds, (fd_set *) 0, (fd_set *) 0,
				(struct timeval *) 0);
		if (result <= 0) {
			perror("Error");
			exit(1);
		}

		if (FD_ISSET(0, &testfds)) {
			memset(option, '\0', 1024);
			fgets(option, 1024, stdin);
			option[strlen(option) - 1] = '\0';
			parse_command(option);

		}

		else {

			for (fd = 0; fd < FD_SETSIZE; fd++) {
				if (FD_ISSET(fd, &testfds)) {
					if (fd == server_sockfd)

					{
						client_sockfd = accept(server_sockfd,
								(struct sockaddr *) &client_address,
								&client_len);

						FD_SET(client_sockfd, &readfds);

					} else {
						memset(ch, 0, 100);
						ioctl(fd, FIONREAD, &nread);
						if (nread == 0 && fd != 0)

						{
							close(fd);
							int j;
							////finding the fd in client connection////
							for (j = 1; j < 4; j++) {

								if (mycon[j].confd == fd) {
									break;
								}
							}

							////terminate the connection
							terminate_con(mycon[j].con_id);
							FD_CLR(fd, &readfds);

							display_con();

						} else {
							char temp1[1024];
							memset(ch, 0, 1024);
							memset(temp1, 0, 1024);
							read(fd, &ch, sizeof(ch));
							strcpy(temp1, ch);
							char *reader;
							reader = strtok(temp1, " ");

							if (reader != NULL) {

								if (strcmp(reader, "send") == 0) {
									read_table(fd, ch);
									memset(ch, 0, 1024);

								}

								else if (strcmp(reader, "connect") == 0) {

									update_conn(ch, fd);
									memset(ch, 0, 1024);

								} else if (strcmp(reader, "ERROR") == 0) {

									fprintf(stderr, "\n%s\n", ch);
									memset(ch, 0, 1024);

								} else if (strcmp(reader, "upload") == 0) {
									char filenm[256];
									bzero(filenm, 256);
									char* tk;
									long long files;
									tk = strtok(NULL, " ");

									strcpy(filenm, tk);

									tk = strtok(NULL, " ");
									files = atoll(tk);

									int val = file_receive(fd, files, filenm);
									if (val == -1)
										fprintf(stderr,
												"\n\nERROR IN FILE TRANSFER\n\n");
									memset(ch, 0, 1024);

								} else if (strcmp(reader, "terminate") == 0) {

									char* temp2;
									char ht[50];
									int pt, i;
									temp2 = strtok(NULL, " ");
									strcpy(ht, temp2);
									temp2 = strtok(NULL, " ");
									pt = atoi(temp2);
									for (i = 1; i < 4; i++) {
										if (((strcmp(mycon[i].hostn, ht) == 0))
												&& (mycon[i].port == pt))
											break;

									}

									mycon[i].con_id = -1;
									close(mycon[i].confd);
									FD_CLR(mycon[i].confd, &readfds);
									display_con();
									memset(ch, 0, 1024);

								} else if (strcmp(reader, "download") == 0) {
									char dfile[256], conip[16];
									bzero(dfile, 256);
									char* toknize;
									int dfd, port;
									toknize = strtok(NULL, " ");
									strcpy(dfile, toknize);
									toknize = strtok(NULL, " ");
									strcpy(conip, toknize);
									toknize = strtok(NULL, " ");
									port = atoi(toknize);
									int j;
									for (j = 1; j < 4; j++) {

										if ((strcmp(mycon[j].ip, conip) == 0)
												&& (mycon[j].port == port))
											break;
									}
									int val = file_transfer(mycon[j].confd,
											dfile);
									if (val == -1) {
										fprintf(stderr,
												"\n\nERROR IN FILE TRANSFER\n\n");
										write(mycon[j].confd, "ERROR IN FILE",
												30);
									}
									memset(ch, 0, 1024);

								}
							} else {

								memset(ch, '\0', 1024);
								memset(temp1, '\0', 1024);
								reader = NULL;

							}
						}
					}

				}
			}
		}
	}
}