void connectToServer(char * serveraddress, char * port, char* transType, char * infile){
    // SSL init 
	SSL_library_init(); 
	// ============== SSL init //
	
	// establish connection
	BIO* bio = establishSSLConnection(serveraddress, port);
	// ================ STEP 1 FINISHED ESTABLISHED AN SSL CONNECTION
 	// Verify client
 	performRSAChallenge(serveraddress, port, bio);
 	// ================ 
 	int transaction = verifyTransaction(serveraddress, port, transType, bio);
 	if(transaction == 1) //send
 	{
 		sendFile(serveraddress, port, infile, bio);
 	}
 	if(transaction == 2) //recieve
 	{
 		recieveFile(serveraddress, port, infile, bio);
 	}
 	if(transaction < 0) //error
 	{
 		printf("Something went wrong with determining transaction type.");
 	}
 	if(transaction < 0) //error
 	{
 		printf("Something went wrong with determining transaction type.");
 	}
	printf("SSL Connection closed.\n");
	BIO_free(bio);
}
예제 #2
0
/**
*@description download single file from sock using http protocol
*@param filePath char pointer to a filepath
*@param sockFd int  socket Id
*@param isAlive  whether to create persistent connection
*@return if failed, return negative number, otherwise, nonnegative
*/
int downloadSingleFile(char* filePath, int sockFd, enum KeepAlive isAlive) {
	char buffer[512];
	int recvLen = 0;
	//send request line
	memset(buffer, '\0', sizeof(buffer));
	snprintf(buffer, sizeof(buffer) - 1, "GET %s HTTP/1.0\r\n", filePath);
	if (send(sockFd, buffer, strlen(buffer), 0) < 0) {
		return -1;
	}

	//send connection type
	memset(buffer, '\0', sizeof(buffer));
	if (isAlive == persistent) {
		snprintf(buffer, sizeof(buffer) - 1, "Connection: keep-alive\r\n");
	} else {
		snprintf(buffer, sizeof(buffer) - 1, "Connection: close\r\n");
	}
	if (send(sockFd, buffer, strlen(buffer), 0) < 0) {
		return -1;
	}

	//send suffix 
	memset(buffer, '\0', sizeof(buffer));
	snprintf(buffer, sizeof(buffer) - 1, "\r\n");
	if (send(sockFd, buffer, strlen(buffer), 0) < 0) {
		printf("%s %s send request for file %s failed\n", __FILE__, __func__, filePath);
		return -1;
	}

	printf(" start to recv response for file %s\n", filePath);
	//start to recieve response
	int numHeaders = 0;
	memset(buffer,'\0',sizeof(buffer));
	Response * response = (Response*) malloc(sizeof(Response));
	response->isAlive = no_persistent;
	response->content_len = 0;
	if (getLineFromSock(sockFd, buffer, sizeof(buffer)-1) > 0) {//read response line
		//parse requestline successfully
		if (parseHttpResponseLine(buffer, strlen(buffer), &(response->responseLine)) >= 0){
			//printf("response code is %s\n", (response->responseLine).code);
			//read each header per line, end by a blank line
			numHeaders = 0;
			memset(buffer,'\0',sizeof(buffer));
			while (getLineFromSock(sockFd, buffer, sizeof(buffer)-1) > 0) { 
				response->headers[numHeaders] = (Header*) malloc(sizeof(Header));
				if ( parseHeader(buffer, strlen(buffer), response->headers[numHeaders]) > 0) {
					//printf("parsed header name %s  value %s\n",response->headers[numHeaders]->name, response->headers[numHeaders]->value);
					// get connect alive status
					if (strcmp(response->headers[numHeaders]->name, "Connection") == 0) {
						if (strcmp(response->headers[numHeaders]->value, "keep-alive") == 0) {
							response->isAlive = persistent;
						} else {
							response->isAlive = no_persistent;
						}
					}
					// get content length
					if (strcmp(response->headers[numHeaders]->name, "Content-Length") == 0) {
						response->content_len = atoi(response->headers[numHeaders]->value);
					}
					memset(buffer,'\0',sizeof(buffer));
					numHeaders++;
				} else {
					free(response->headers[numHeaders]);
					printf("pare header failed: \n%s\n", buffer);
					break;
				}
			}
			
		} 

	}

	if (response->content_len > 0) {
		recvLen = recieveFile(response->content_len, sockFd);
		if (recvLen == response->content_len) {
		  printf("\nsuccessfully receive %d bytes for file %s\n", recvLen, filePath);
		} else {
		  printf("\n%s %s failed  to  receive %d bytes for file %s, only recev %d bytes\n", __FILE__, __func__, response->content_len, filePath, recvLen);
		}
	} else {
		return -1;
	}
	//free dynamically allocated memory
	int i;
	for (i = 0; i< numHeaders; i++) {
		free(response->headers[i]);
	}
	free(response);
	return recvLen;
}
예제 #3
0
void fileClient(int sockfd,struct sockaddr_in* servaddr, socklen_t servlen, client_args* c_arguments)
{
		//printf("Filename : %s\n", c_arguments->file_name);
	struct sockaddr_in newServAddr; //The address got when the child sends the port number
	struct sockaddr_in changeServAddr; //New server address to which I'll do my calling
	socklen_t newLen, socklen;

	char buffer[BUFSIZE];
	char recvBuffer[BUFSIZE];
	char str[BUFSIZE];
	int serverPort;
	memset(str,0,BUFSIZE);
	memset(recvBuffer, 0, BUFSIZE);
	memset(buffer, 0, BUFSIZE);
	bzero(&newServAddr, sizeof(newServAddr));
	bzero(&changeServAddr, sizeof(changeServAddr));

	fd_set rset;
	int maxfdp1;
	FD_ZERO(&rset);
	
	int retransmitCounter =0;

	inet_ntop(AF_INET,&servaddr->sin_addr, str, sizeof(str));
	//printf("Server Address : %s\n", str);
	//printf("Server Port : %u\n", servaddr->sin_port);

	struct timeval time_count;

send_filename:	

	retransmitCounter++;
	if(retransmitCounter > 3)
	{
		printf("Server never sent a Port number message\n");
		printf("Now will terminate the client\n");
		exit(1);
	}


	time_count.tv_sec = 3;
	time_count.tv_usec = 0;

	//printf("Length of filename = %d\n", strlen(c_arguments->file_name));
	sprintf(buffer,"%s",c_arguments->file_name);
	//printf("Filename : %s\n", buffer);	
	//if(sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr*) servaddr, sizeof(struct sockaddr)) < 0)
	if(write(sockfd, buffer, strlen(buffer)) < 0)
	{
		perror("SendTo failed:");
		exit(1);
	}
	

	FD_SET(sockfd, &rset);
	maxfdp1=sockfd+1;

	if(select(maxfdp1, &rset, NULL, NULL, &time_count) < 0)
	{
		if(errno == EINTR)
			goto send_filename;
		else
		{
			perror("Select Error :");
			exit(1);
		}
	}
	if(FD_ISSET(sockfd, &rset))
	{
		//printf("Hi I'm here");
		newLen = sizeof(newServAddr);
		if(recvfrom(sockfd, recvBuffer, BUFSIZE, 0, (struct sockaddr*)&newServAddr, &newLen) < 0)
		{
			perror("RecvFrom error :");
			exit(1);
		}
		printf("Port received from server : %d\n", atoi(recvBuffer));
		
	}
	else
	{
		goto send_filename;
	}
	
	changeServAddr.sin_family = AF_INET;
	changeServAddr.sin_addr = newServAddr.sin_addr;
	changeServAddr.sin_port = htons(atoi(recvBuffer));

	//Step - Forgotten
	//Connect to new socket with the received port number
	if(connect(sockfd,(struct sockaddr*)&changeServAddr,sizeof(struct sockaddr))< 0)
	{
		perror("Server Connection Failed:");
		exit(1);
	}
	struct sockaddr_in newServSock;
	socklen_t newSocklen;
	bzero(&newServSock, sizeof(newServSock));
	newSocklen = sizeof(newServSock);
	
	if(getpeername(sockfd, (struct sockaddr*)&newServSock, &newSocklen) < 0)
	{
		perror("Getpeername failed :");
		exit(1);
	}
	
	printf("New Server address %s:%u\n",inet_ntoa(newServSock.sin_addr), ntohs(newServSock.sin_port));


	//Step - To send the ACK for the port number received (Send the message window)

	FD_ZERO(&rset);
	bzero(&newServAddr, sizeof(newServAddr));
	retransmitCounter=0;

send_ACK_for_port:
	
	retransmitCounter++;
	if(retransmitCounter > 3)
	{
		printf("Server never sent a ACK for my message window\n");
		printf("Now will terminate the client\n");
		exit(1);
	}

	time_count.tv_sec = 3;
	time_count.tv_usec = 0;
	memset(buffer, 0, BUFSIZE);
	sprintf(buffer,"%d",c_arguments->window_size);
	//if(sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr*)&changeServAddr, sizeof(struct sockaddr)) < 0)
	if(write(sockfd, buffer, strlen(buffer)) < 0)
	{
		perror("SendTo failed:");
		exit(1);
	}

	

	FD_SET(sockfd, &rset);
	maxfdp1=sockfd+1;

	if(select(maxfdp1, &rset, NULL, NULL, &time_count) < 0)
	{
		if(errno == EINTR)
			goto send_ACK_for_port;
		else
		{
			perror("Select Error :");
			exit(1);
		}
	}
	if(FD_ISSET(sockfd, &rset))
	{
		//printf("Hi I'm here");
		newLen = sizeof(newServAddr);
		memset(recvBuffer, 0, BUFSIZE);
		if(recvfrom(sockfd, recvBuffer, BUFSIZE, 0, (struct sockaddr*)&newServAddr, &newLen) < 0)
		{
			perror("RecvFrom error :");
			if(errno == 111)
			{
				printf("Server never sent an ACK for my window buffer message\n");
				printf("Now terminating the client\n");
			}			
			exit(1);
		}
		//printf("	received this : %s\n", recvBuffer);
		if(strcmp(recvBuffer, "ACK") == 0)
		{	
			//printf("Yes\n");
			goto send_ACK_for_port;
		}
		goto send_File;
		
	}
	else
	{
		goto send_ACK_for_port;
	}

send_File:
	recieveFile(sockfd, c_arguments->file_name, c_arguments->window_size, c_arguments->seed, c_arguments->probability, c_arguments->mean_time);
	return;
}