Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <arpa/inet.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <sys/socket.h>
- #include <unistd.h>
- #include <stdbool.h>
- struct Transfer {
- char request;
- char filename[64];
- int fileSize;
- };
- struct TransferResponse {
- char response;
- int fileSize;
- };
- int main(int argc, char** argv){
- char ip[16];
- int port;
- scanf("%s %d", ip, &port); // reading the IP and PORT
- struct sockaddr_in serverAdress;
- memset(&serverAdress, 0, sizeof(serverAdress));
- serverAdress.sin_family = AF_INET; // IPv4
- serverAdress.sin_port = htons(port); // convert port to network byte order
- serverAdress.sin_addr.s_addr = inet_addr(ip);
- /// Creating a TCP socket
- int sock = socket(AF_INET, SOCK_STREAM, 0);
- int connectionResult = connect(sock, (struct sockaddr*)&serverAdress, sizeof(serverAdress));
- if(connectionResult < 0) {printf("Connection failed :<");}
- while(true)
- {
- char b1; scanf("%c", &b1);
- char operation;
- scanf("%c", &operation);
- if(operation == 'D')
- {
- char buff;
- scanf("%c", &buff); // reading the space
- char filename[64];
- scanf("%s", filename);
- struct Transfer t;
- memset(&t, 0, sizeof(t));
- t.request = operation;
- strcpy(t.filename, filename);
- t.fileSize = 0;
- // Sending a transfer request to the server
- send(sock, &t, sizeof(t), 0);
- struct TransferResponse r;
- recv(sock, &r, sizeof(r), 0);
- if(r.response == 'N')
- {
- printf("File %s does not exist on server.\n", filename);
- continue;
- }
- // receiving the file content
- char buffer[1024];
- int bytesR = 0;
- if(!(r.fileSize <= 0 || r.fileSize > 1024))
- {
- bytesR = recv(sock, buffer, r.fileSize, 0);
- }
- FILE *dwn = fopen(filename, "w");
- fwrite(buffer, sizeof(char), bytesR, dwn);
- fclose(dwn);
- buffer[bytesR] = '\0';
- printf("File %s downloaded.\n", filename);
- printf("%s\n", buffer);
- }
- if(operation == 'U')
- {
- char buff;
- scanf("%c", &buff); // skip space
- char filename[64];
- scanf("%s", filename);
- // Open file to read content
- FILE* file = fopen(filename, "r");
- if (!file)
- {
- printf("File %s not found.\n", filename);
- continue;
- }
- // Determine file size
- fseek(file, 0, SEEK_END);
- int fileSize = ftell(file);
- rewind(file); // reset pointer to beginning
- // Read file content into buffer
- char buffer[1024];
- fread(buffer, sizeof(char), fileSize, file);
- fclose(file);
- // Prepare Transfer struct
- struct Transfer t = {0};
- t.request = 'U';
- strcpy(t.filename, filename);
- t.fileSize = fileSize;
- // Send Transfer struct
- send(sock, &t, sizeof(t), 0);
- // Receive server response
- struct TransferResponse r;
- recv(sock, &r, sizeof(r), 0);
- if (r.response == 'N') {
- printf("File %s already exists on server.\n", filename);
- continue;
- }
- // Send file content
- send(sock, buffer, fileSize, 0);
- printf("File %s uploaded.\n", filename);
- }
- if(operation == 'C')
- {
- struct Transfer t;
- memset(&t, 0, sizeof(t));
- t.request = operation;
- strcpy(t.filename, "");
- t.fileSize = 0;
- send(sock, &t, sizeof(t), 0);
- close(sock);
- break;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement