Я пытаюсь отправить файлы с помощью TCP от клиента окна к серверу Linux в C.Файл частично отправлен в с
Размер буфера я использую для передачи данных 65535. Если размер файл превышает это значение, я получаю сообщение об ошибке «сброс соединения с помощью одноранговой сети» или код ошибки 10054. Когда размер файла меньше 65535 байт, сервер получает только часть его (обычно 2760 байт).
Я просто хочу отправить файлы с максимальным размером 50 МБ.
Это часть клиента окон, которые я использую для отправки данных:
char *fileName; // pointer to filename
char buf[65535]; // buffer
int fileSize; // # bytes to send
for(i = 0; i < ARRAYSIZE; i++) {
if(selectList[i] != NULL) {
// select file
fileName= selectList[i]; // get path and filename from selectList
printf("=============================================\nSending: %s\n", fileName);
filefd = fopen(fileName, "rb"); // open file
if(filefd == NULL) {
printf("File %s not found\n", fileName);
exit(1);
}
// read and send file
memset(buf, '\0', 65535);
while((fileSize= fread(buf, sizeof(char), 65535, filefd)) > 0) { // read file
if((numberOfBytes = send(sockfd, buf, fileSize, 0)) < 0) { // send buffer
printf("send: %s (Error: %d)\n", filename, WSAGetLastError());
break;
}
printf("#bytes = %i \n", numberOfBytes);
memset(buf, '\0', 65535);
}
printf("File %s send!\n", filename);
// close file after sending it
if(fclose(filefd) < 0) {
printf("fclose: %i", WSAGetLastError());
}
} else if(selectList[0] == NULL) {
printf("no files selected");
}
}
SelectList содержит несколько строк, например: C: \ Windows \ test.txt
Recieve часть сервер Linux:
char* fr_name = "/home/MtFS/UploadedFiles/public/testFile.gif";
FILE *fr = fopen(fr_name, "wb");
if(fr == NULL)
printf("[Open_File]file %s cannot be created\n", fr_name);
else {
bzero(revbuf, LENGTH);
int fr_block_sz = 0;
while((fr_block_sz = recv(nsockfd, revbuf, LENGTH, 0)) > 0) {
int write_sz = fwrite(revbuf, sizeof(char), fr_block_sz, fr);
if(write_sz < fr_block_sz) {
error("[Write] error\n");
}
bzero(revbuf, LENGTH);
if (fr_block_sz == 0 || fr_block_sz != 512) {
break;
}
}
if(fr_block_sz < 0) {
if (errno == EAGAIN) {
printf("[Receive] time out\n");
}
else {
printf("[Receive] error\n");
exit(1);
}
}
printf("[Receive] succesfull\n");
fclose(fr);
}
Что я делаю неправильно?
Спасибо за ответы, я изменил, если-заявление если (fr_block_sz == 0) размер файла ПОЛУЧАЛ правильно, но сам файл пуст/поврежден. Любые подсказки? – EJN
Спасибо, что это работает сейчас, я случайно изменил что-то еще. if (fr_block_sz == 0). – EJN
Ошибки обнаруживаются с -1, read/recv возвращает -1 и устанавливает переменную errno. Для получения дополнительной информации попробуйте 'man 2 read' и' man 2 recv' в консоли Linux. –