Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h> //strlen
- #include <sys/socket.h>
- #include <arpa/inet.h> //inet_addr
- #include <unistd.h> //write
- #include <fcntl.h> //for open
- #include <unistd.h> //for close
- #include <stdbool.h>
- #include <stdlib.h>
- #define DEFAULT_BUFLEN 512
- #define DEFAULT_PORT 27015
- char* List(FILE *fp) {
- char data[DEFAULT_BUFLEN];
- char *lista = NULL;
- long filesize = ftell(fp);
- lista = malloc(filesize);
- while(fscanf(fp, "%s", data) == 1) {
- strcat(lista, data);
- strcat(lista, "\n");
- }
- return lista;
- }
- int WriteList(FILE *fp, char *data) {
- int flag = 0;
- char ime[DEFAULT_BUFLEN];
- while(fscanf(fp, "%s", ime) != EOF) {
- if(strcmp(ime, data) == 0) {
- flag = 1;
- printf("Datoteka sa istim imenom vec postoji\n");
- break;
- }
- }
- if(flag == 0) {
- fprintf(fp, "%s\n", data);
- printf("Uspesno upisana datoteka u listu\n");
- }
- return flag;
- }
- int ReadList(FILE *fp, char *data) {
- int flag = 0;
- char ime[DEFAULT_BUFLEN];
- while(fscanf(fp, "%s", ime) != EOF) {
- if(strcmp(ime, data) == 0) {
- printf("Datoteka postoji, OK\n");
- break;
- }
- flag = 1;
- }
- return flag;
- }
- //////////////////////////////////////// READ
- bool readdata(int sock, void *buf, int buflen)
- {
- unsigned char *pbuf = (unsigned char *) buf;
- while (buflen > 0)
- {
- int num = recv(sock, pbuf, buflen, 0);
- pbuf += num;
- buflen -= num;
- }
- return true;
- }
- bool readlong(int sock, long *value)
- {
- if (!readdata(sock, value, sizeof(value)))
- return false;
- *value = ntohl(*value);
- return true;
- }
- bool readfile(int sock, FILE *f)
- {
- long filesize;
- if (!readlong(sock, &filesize))
- return false;
- if (filesize > 0)
- {
- char buffer[1024];
- do
- {
- int num;
- if(filesize > sizeof(buffer))
- num = sizeof(buffer);
- else
- num = filesize;
- if (!readdata(sock, buffer, num))
- return false;
- int offset = 0;
- do
- {
- size_t written = fwrite(&buffer[offset], 1, num-offset, f);
- if (written < 1)
- return false;
- offset += written;
- }
- while (offset < num);
- filesize -= num;
- }
- while (filesize > 0);
- }
- return true;
- }
- //////////////////////////////////////// SEND
- bool senddata(int sock, void *buf, int buflen)
- {
- unsigned char *pbuf = (unsigned char *) buf;
- while (buflen > 0)
- {
- int num = send(sock, pbuf, buflen, 0);
- pbuf += num;
- buflen -= num;
- }
- return true;
- }
- bool sendlong(int sock, long value)
- {
- value = htonl(value);
- return senddata(sock, &value, sizeof(value));
- }
- bool sendfile(int sock, FILE *f)
- {
- fseek(f, 0, SEEK_END);
- long filesize = ftell(f);
- rewind(f);
- if (filesize == EOF)
- return false;
- if(!sendlong(sock, filesize))
- return false;
- if (filesize > 0)
- {
- char buffer[1024];
- do
- {
- size_t num;
- if(filesize > sizeof(buffer))
- num = sizeof(buffer);
- else
- num = filesize;
- num = fread(buffer, 1, num, f);
- if (num < 1)
- return false;
- if (!senddata(sock, buffer, num))
- return false;
- filesize -= num;
- }
- while (filesize > 0);
- }
- return true;
- }
- int main(int argc , char *argv[])
- {
- int socket_desc , client_sock, c , read_size;
- struct sockaddr_in server , client;
- char client_message[DEFAULT_BUFLEN];
- //Create socket
- socket_desc = socket(AF_INET , SOCK_STREAM , 0);
- if (socket_desc == -1)
- {
- printf("Server: Could not create socket");
- }
- puts("Server: Socket created");
- //Prepare the sockaddr_in structure
- server.sin_addr.s_addr = INADDR_ANY;
- server.sin_family = AF_INET;
- server.sin_port = htons(DEFAULT_PORT);
- //Bind
- if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
- {
- //print the error message
- perror("Server: bind failed. Error");
- return 1;
- }
- puts("Server: bind done");
- //Listen
- listen(socket_desc , 3);
- //Accept and incoming connection
- puts("Server: Waiting for incoming connections...");
- c = sizeof(struct sockaddr_in);
- //accept connection from an incoming client
- client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);
- if (client_sock < 0)
- {
- perror("Server: accept failed");
- return 1;
- }
- puts("Server: Connection accepted");
- char ime[DEFAULT_BUFLEN];
- char ime2[DEFAULT_BUFLEN] = "../";
- char *lista;
- int opcija;
- recv(client_sock, &opcija, sizeof(opcija), 0);
- int flagwrite = -1;
- int flagread = -1;
- FILE *fplist, *fp;
- if(opcija == 1) {
- printf("Opcija: %d\n", opcija);
- read_size = recv(client_sock, ime, DEFAULT_BUFLEN, 0);
- ime[read_size] = '\0';
- printf("Ime: %s\n", ime);
- strcat(ime2, ime);
- fplist = fopen("lista.txt", "r+");
- flagwrite = WriteList(fplist, ime);
- fclose(fplist);
- send(client_sock, &flagwrite, sizeof(flagwrite), 0);
- if(flagwrite == 0) {
- fp = fopen(ime2, "wb");
- if(fp != NULL) {
- readfile(client_sock, fp);
- fclose(fp);
- }
- }
- }
- else if(opcija == 2) {
- printf("Opcija: %d\n", opcija);
- read_size = recv(client_sock, ime, DEFAULT_BUFLEN, 0);
- ime[read_size] = '\0';
- printf("Ime: %s\n", ime);
- strcat(ime2, ime);
- fplist = fopen("lista.txt", "r");
- flagread = ReadList(fplist, ime);
- fclose(fplist);
- send(client_sock, &flagread, sizeof(flagread), 0);
- if(flagread == 0) {
- fp = fopen(ime2, "rb");
- sendfile(client_sock, fp);
- fclose(fp);
- }
- }
- else if(opcija == 3) {
- fplist = fopen("lista.txt", "r");
- lista = List(fplist);
- send(client_sock, lista, strlen(lista), 0);
- fclose(fplist);
- }
- close(socket_desc);
- close(client_sock);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement