Позвольте мне начать с того, что это домашнее задание, и я не программист на c. Я работаю над этим несколько дней, и я застрял. Я прочитал руководство beej от обложки до крышки и искал google в течение недели, пришло время обратиться за помощью. У меня есть приложение TCP-сокета клиент-сервер, которое отправляет и получает сообщения, как ожидалось, теперь мне нужно реализовать простую функцию загрузки/загрузки файлов.c socket file transfer
Код ниже почти работает, но он добавляет 4 байта в начало скопированного файла, два непечатаемых символа, за которыми следует \ 00 \ 00, и клиент больше не отвечает.
Клиент подключается неблокирующим сокетом с помощью команды выбора.
Я знаю, что есть много возможностей для улучшения, но может кто-то помочь мне начать?
// Сервер
void put (int sockfd, char *localfile) {
// Get file Size
FILE *file;
int size;
file = fopen(localfile, "rb");
fseek(file, 0, SEEK_END);
size = ftell(file);
fseek(file, 0, SEEK_SET);
//Send file Size
write(sockfd, &size, sizeof(int));
//Send file as Byte Array
char send_buffer[size];
memset(send_buffer, 0, sizeof(send_buffer));
//while(!feof(file)) {
// fread(send_buffer, 1, sizeof(send_buffer), file);
// write(sockfd, send_buffer, sizeof(send_buffer));
// memset(send_buffer, 0, sizeof(send_buffer));
//}
int sent;
while((sent = fread(send_buffer, sizeof(char), sizeof(send_buffer), file)) > 0)
{
if(send(sockfd, send_buffer, sent, 0) < 0)
{
fprintf(stderr, "[Server] ERROR: Failed to send file %s. (errno = %d)\n", localfile, errno);
break;
}
memset(send_buffer, 0, sizeof(send_buffer));
}
fclose(file);
}
// Клиент
void get(int sockfd, char *remotefile) {
FILE *file;
int size;
//Read file Size
read(sockfd, &size, sizeof(int));
//Read file Byte Array
char p_array[size];
memset(&p_array, 0, sizeof(p_array));
read(sockfd, p_array, size);
//Convert it Back into file
file = fopen(remotefile, "wb");
fwrite(p_array, 1, sizeof(p_array), file);
fclose(file);
}
Просто предостережение, прочитайте [этот поток StackOverflow] (http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong), чтобы узнать, как правильно использовать 'feof()'. –
Может ли быть простой случай, когда вы не инициализируете свои массивы типа 'char send_buffer [size] = {0};' и 'char p_array [size] = {0};'? –