Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ftpc.cpp : Defines the entry point for the console application.
- //
- #include <windows.h>
- #include <stdio.h>
- #include <iostream>
- #include <fstream>
- using namespace std;
- SOCKET sockfd_link, sockfd_data;
- bool active = true;
- bool login(char *username, char* password)
- {
- char buffer[300];
- buffer[0] = '\0';
- strcpy(buffer, "USER ");
- strncat(buffer, username, strlen(username));
- strcat(buffer, "\r\n");
- send(sockfd_link, (char*)&buffer, strlen(buffer), 0);
- buffer[0] = '\0';
- recv(sockfd_link, (char*)&buffer, 300, 0);
- buffer[3] = '\0';
- if(strcmp(buffer, "230") == 0)
- return true;
- else if(strcmp(buffer, "331") == 0)
- {
- buffer[0] = '\0';
- strcpy(buffer, "PASS ");
- strncat(buffer, password, strlen(password));
- strcat(buffer, "\r\n");
- send(sockfd_link, (char*)&buffer, strlen(buffer), 0);
- buffer[0] = '\0';
- recv(sockfd_link, (char*)&buffer, 300, 0);
- buffer[3] = '\0';
- if(strcmp(buffer, "230") == 0)
- return true;
- else
- return false;
- }
- else
- {
- return false;
- }
- }
- DWORD WINAPI CheckIfCompleteReceive(LPVOID lpParam)
- {
- char buffer[50];
- recv(sockfd_link, buffer, 50, 0);
- buffer[3] = '\0';
- bool *complete = (bool *)lpParam;
- if(strcmp(buffer, "226") == 0)
- {
- *complete = true;
- }
- else
- *complete = false;
- return 0;
- }
- bool get(char *path, struct sockaddr_in *sockaddr_data)
- {
- char buffer[200];
- DWORD threadID;
- int length = sizeof(struct sockaddr);
- listen(sockfd_data, 5);
- if(active)
- {
- strcpy(buffer, "RETR ");
- strncat(buffer, path, strlen(path));
- strcat(buffer, "\r\n");
- send(sockfd_link, (char*)&buffer, 200, 0);
- recv(sockfd_link, (char*)&buffer, 200, 0);
- buffer[3] = '\0';
- SOCKET sock_incoming;
- if(strcmp(buffer, "150") == 0)
- {
- sock_incoming = accept(sockfd_data, (struct sockaddr *)&sockaddr_data, &length);
- cout << "Otvaranje Data konekcije!\n";
- }
- else
- return false;
- ofstream fstream_out;
- fstream_out.open(path, ios::out | ios::binary | ios::app);
- bool *finished = false;
- HANDLE completeThrd = CreateThread(NULL,0,CheckIfCompleteReceive, (void *)&finished, 0, &threadID);
- int nrbytes;
- char temp[200];
- while(!finished)
- {
- nrbytes = recv(sock_incoming, (char*)&buffer, 200, 0);
- strncpy(temp,buffer,nrbytes);
- temp[nrbytes] = '\0';
- fstream_out << temp;
- }
- fstream_out.close();
- return true;
- }
- else
- {
- }
- }
- int opcije()
- {
- cout << "Komande:\n";
- cout << "\t1. login\n";
- cout << "\t2. get\n";
- cout << "\t3. put\n";
- cout << "\t4. port\n";
- cout << "\t5. quit\n";
- char response[2];
- cin >> response;
- cout << "\n\n";
- int ret = atoi(&response[0]);
- if(ret > 0 && ret < 6)
- return ret;
- else
- return 0;
- }
- bool port(char *param)
- {
- char buffer[50];
- buffer[0] = '\0';
- strcpy(buffer, "PORT ");
- strncat(buffer, param, strlen(param));
- strcat(buffer, "\r\n");
- send(sockfd_link, buffer, 50, 0);
- recv(sockfd_link, buffer, 50, 0);
- buffer[3] = '\0';
- if(strcmp(buffer, "200") == 0)
- return true;
- else
- return false;
- }
- int main(int argc, char** argv)
- {
- WSAData wsaData;
- WSAStartup(MAKEWORD(2, 1), &wsaData);
- sockfd_link = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
- sockfd_data = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
- struct sockaddr_in sockaddr_link_my, sockaddr_data_my;
- struct sockaddr_in sockaddr_link, sockaddr_data;
- memset(&sockaddr_link_my, 0, sizeof(struct sockaddr_in));
- sockaddr_link_my.sin_family = AF_INET;
- sockaddr_link_my.sin_addr.s_addr = INADDR_ANY;
- sockaddr_link_my.sin_port = htons(0);
- memset(&sockaddr_data_my, 0, sizeof(struct sockaddr_in));
- sockaddr_data_my.sin_family = AF_INET;
- sockaddr_data_my.sin_addr.s_addr = INADDR_ANY;
- sockaddr_data_my.sin_port = htons(20);
- bind(sockfd_link, (struct sockaddr*)&sockaddr_link_my, sizeof(struct sockaddr));
- bind(sockfd_data, (struct sockaddr*)&sockaddr_data_my, sizeof(struct sockaddr));
- if(argc != 2)
- {
- printf("Greska u parametrima!\nParametar je IP adresa servera.\n");
- exit(0);
- }
- memset(&sockaddr_link, 0, sizeof(struct sockaddr_in));
- sockaddr_link.sin_family = AF_INET;
- sockaddr_link.sin_addr.s_addr = inet_addr(argv[1]);
- sockaddr_link.sin_port = htons(21);
- memset(&sockaddr_data, 0, sizeof(struct sockaddr_in));
- sockaddr_data.sin_family = AF_INET;
- sockaddr_data.sin_addr.s_addr = INADDR_ANY;//inet_addr(argv[1]);
- sockaddr_data.sin_port = htons(0); //ovde sam menjo
- if(connect(sockfd_link, (struct sockaddr*)&sockaddr_link, sizeof(struct sockaddr)) == SOCKET_ERROR)
- {
- printf("Greska u konektovanju!\n");
- }
- char buffer[100];
- int ret = recv(sockfd_link, buffer, 100, 0);
- buffer[3] = '\0';
- if(ret == 0)
- printf("Server nas ne voli!\n");
- else if(ret < 0)
- printf("server prica kineski!\n");
- else
- {
- if(strcmp(buffer, "220") == 0)
- printf("Uspesna konekcija!\n");
- else
- printf("ne vrne 220\n");
- }
- while((ret = opcije()) != 5)
- {
- if(ret == 0)
- printf("Nepostojeca opcija!\n\n");
- else if(ret == 1)
- {
- char username[15], password[15];
- password[0] = '\0';
- cout << "Unesite username: ";
- cin >> username;
- if(!login(username, password))
- {
- cout << "Unesite password: ";
- cin >> password;
- if(!login(username, password))
- {
- cout << "Greska u unosu!\n\n";
- }
- else
- cout << "Uspesno logovanje.\n";
- }
- else
- cout << "Uspesno logovanje.\n";
- }
- else if(ret == 2)
- {
- char path[50];
- cout << "Unesite putanju do fajla: ";
- cin >> path;
- /*if(active)
- {
- }
- else
- {
- }*/
- if(get(path, &sockaddr_data))
- cout << "Fajl je uspesno prosledjen.\n";
- else
- cout << "Greska u prosledjivanju fajla!\n";
- }
- else if(ret == 4)
- {
- char buffer[40];
- cout << "Unesite parametre za port: ";
- cin >> buffer;
- if(port(buffer))
- cout << "Uspesna redirekcija data konekcije.\n";
- else
- cout << "Greska u redirektovanju data konekcije!\n";
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment