2013-09-01 2 views
0

Я пытаюсь реализовать сервер-клиентское приложение, в котором клиент отправляет имя файла на сервер. Сервер ищет файл, и если файл существует, он отправляет файл клиенту, и это продолжается. Вот код, который я написал, но проблема в том, что сервер не отправляет содержимое файла обратно клиенту. У меня была такая же проблема раньше, а затем я переписал код.Создание приложения для передачи файлов с использованием UDP в C

Вот код: -

Server Side

#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <string.h> 

int main() { 
    char buff[20]; 
    char content[200]; 
    int sd, connfd, len, bytes_read; 

    struct sockaddr_in servaddr, cliaddr; 

    sd = socket(AF_INET, SOCK_DGRAM, 0); 

    if (sd == -1) { 
     puts("socket not created in server"); 
     return 1; 
    } else { 
     puts("socket created in server"); 
    } 

    bzero(&servaddr, sizeof(servaddr)); 

    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr = INADDR_ANY; 
    servaddr.sin_port = htons(7802); 

    if (bind(sd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) { 
     puts("Not binded"); 
     return 1; 
    } else { 
     puts("Binded"); 
    } 

    len = sizeof(cliaddr); 

    recvfrom(sd, buff, 1024, 0, (struct sockaddr *)&cliaddr, &len); 

    printf("%s\n", buff); 

    FILE *fp = fopen(buff, "r"); 
    if (fp == NULL) { 
     printf("File does not exist \n"); 
     return 1; 
    } 

    while (1) { 
     bytes_read = read(fp, content, sizeof(content)); 
     if (bytes_read == 0) 
      break; 
     sendto(sd, content, sizeof(content), 0, (struct sockaddr*)&cliaddr, len); 
     bzero(content, 200); 
    } 
    strcpy(content, "end"); 
    sendto(sd, content, sizeof(content), 0, (struct sockaddr*)&cliaddr, len); 

    return 0; 
} 

Клиент сторона:

#include <stdio.h> 
#include <errno.h> 
#include <sys/socket.h> 
#include <resolv.h> 
#include <netinet/in.h> 
#include <sys/types.h> 

int main() { 
    int count = 0; 
    char buff[20], output[20]; 
    char file_buffer[200]; 
    int sockfd, connfd, len; 

    struct sockaddr_in servaddr, cliaddr; 

    sockfd = socket(AF_INET, SOCK_DGRAM, 0); 

    if (sockfd == -1) { 
     puts("socket not created in client"); 
     return 1; 
    } else { 
     puts("socket created in client"); 
    } 

    bzero(&servaddr, sizeof(servaddr)); 

    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr = INADDR_ANY; // ANY address or use specific address 
    servaddr.sin_port = htons(7802); // Port address 

    puts("Type your UDP client message"); 
    scanf("%s", buff); 
    puts("enter the name of new file to be saved"); 
    scanf("%s", output); 

    // send msg to server 
    sendto(sockfd, buff, strlen(buff) + 1, 0, 
      (struct sockaddr *)&servaddr, sizeof(struct sockaddr)); 
    count++; 
    printf("%d\n", count); 

    FILE *fp = fopen(output, "a"); 
    if (fp == NULL) { 
     puts("error in file handling"); 
     return 1; 
    } 
    recvfrom(sockfd, file_buffer, sizeof(file_buffer), 0, NULL, NULL); 
    while (1) { 
     if (strcmp(file_buffer, "end") == 0) 
      break; 
     printf("%s", file_buffer); 
     write(fp, file_buffer, strlen(file_buffer)); 
     bzero(file_buffer, 200); 
     recvfrom(sockfd, file_buffer, sizeof(file_buffer), 0, NULL, NULL); 
    } 

    puts("completed"); 
    return 0; 
} 
+1

Можете ли вы сказать, что именно происходит? – Alex

+0

Вот как должен работать код 1. Клиент отправляет имя файла (buff) 2. Сервер ищет файл, если файл существует, он открывает его для чтения и отправки содержимого клиенту. 3.client запрашивает имя файла, в котором должен храниться выходной файл, и записывает содержимое с сервера в файл. Но после компиляции кода и запуска создается выходной файл, но контент из сервера не записывается в него. –

+0

Вы исправили клиентскую сторону? Вы также используете 'fopen()' и 'write()' вместо 'frwite()'. – Alex

ответ

1

Вероятно, вы должны использовать функцию fread() вместо read() на стороне сервера.

Функции fopen() и read() являются частями различных интерфейсов:

Семья чтения() -> открытие, закрытие, чтение, запись, IOCTL (системные вызовы)

Семейный Fread() -> Еореп , fclose, Fread, FWRITE, Fcntl (стандартная библиотека)

Я могу предположить, что дескриптор файла, данное fopen() не точно такой же, как read() предпологает.

То же самое на стороне клиента. Вы используете fopen() для открытия файла и write() для записи. Пожалуйста, используйте fwrite()

+0

Который, будучи переведенным, означает: в коде сервера вы открываете файл с помощью 'fopen()', но вы пытаетесь прочитать файл с помощью 'read()' передачи указателя файла в качестве дескриптора файла, который не собирается Работа. (A) обратите внимание на предупреждения своего компилятора - если вы их не получили, включите предупреждения или получите лучший компилятор. (B) используйте 'fread()' для файловых потоков, открытых с помощью функции 'fopen(); используйте 'read()' для дескрипторов файлов, созданных с помощью 'open()', 'socket()' и т. д. –

+0

нет, что тоже не работает: \ –

+0

@UdayMittal вы можете обновить данный код? – Alex

Смежные вопросы