Так что мне нужно вернуть html-файл с сервера клиенту, файл больше, чем буфер, поэтому я делаю несколько сообщений. Вот почему у меня этот цикл, когда я ПРИЕМКак возвратить до тех пор, пока theres ничего больше, чтобы recv без eof?
while (i = recv(s, buf, TAM_BUFFER, 0)) {
if (i == -1) {
perror(argv[0]);
fprintf(stderr, "%s: error reading result\n", argv[0]);
exit(1);
}
while (i < TAM_BUFFER) {
j = recv(s, &buf[i], TAM_BUFFER - i, 0);
if (j == -1) {
perror(argv[0]);
fprintf(stderr, "%s: error reading result\n", argv[0]);
exit(1);
}
i += j;
}
/* Print out the file line by line. */
printf("%s", buf);
}
посыла выглядит примерно так:
while (fgets(buf, sizeof(buf), fp)){
if (send(s, buf, TAM_BUFFER, 0) != TAM_BUFFER) errout(hostname);
}
Проблема является цикл никогда не заканчивается, Becase оно не Recv в ВФ и я никогда не является 0, его просто остается заблокированным. Я не могу закрыть сообщение, потому что после того, как он отобразит весь файл, клиент попросит другой файл.
Я попытался отправить SIGALRM, если цикл остается заблокированным более 5 секунд, но он не работает должным образом, потому что цикл не останавливается, и он выдает ошибку.
Также как я могу сделать, чтобы быть в состоянии recv меньше, чем TAM_BUFFER? (В send, измените TAM_BUFFER -> strlen (buf)). Я знаю, что мне нужно изменить внутреннюю петлю, но потом у нее такая же проблема , j не будет 0 никогда, поэтому я не знаю, как я могу закончить его (или, может быть, мне не нужен второй цикл в этом случае).
EDIT: я не могу отправить длину файла beucause из протокола им следующей
Вам нужно отправить длину файла перед файлом и прочитать только то, что много байтов из сокета при получении файла. – EJP
Я забыл добавить это, я уже искал в stackoverflow, и я нашел эту опцию, но протокол im follow dont разрешил мне использовать эту опцию. Мне нужно отправить только то, что спрашивают клиенты, и я не могу отправить длину. –
Вам придется изменить протокол, за которым вы следуете, если он не поддерживает то, что вы пытаетесь сделать. – EJP