Я пытаюсь реализовать сервер-клиентское приложение, в котором клиент отправляет имя файла на сервер. Сервер ищет файл, и если файл существует, он отправляет файл клиенту, и это продолжается. Вот код, который я написал, но проблема в том, что сервер не отправляет содержимое файла обратно клиенту. У меня была такая же проблема раньше, а затем я переписал код.Создание приложения для передачи файлов с использованием 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;
}
Можете ли вы сказать, что именно происходит? – Alex
Вот как должен работать код 1. Клиент отправляет имя файла (buff) 2. Сервер ищет файл, если файл существует, он открывает его для чтения и отправки содержимого клиенту. 3.client запрашивает имя файла, в котором должен храниться выходной файл, и записывает содержимое с сервера в файл. Но после компиляции кода и запуска создается выходной файл, но контент из сервера не записывается в него. –
Вы исправили клиентскую сторону? Вы также используете 'fopen()' и 'write()' вместо 'frwite()'. – Alex