Я пишу сервер и клиент. Так же, как HTTP. клиент запрашивает файл с сервера.
, но на клиенте я не могу прочитать последние данные из socket. пока сервер не завершит запись файла и не закроет (socket_fd). чтение клиентом возвращает 0. поэтому запрос не выполнен.
SUSE 10 Linux
использовать заблокированный файл socket.loop для чтения и записи, как в книге UNP.
установить время ожидания 5 секунд
клиент:
send request head:"get file abc.txt"
Сервер:
find the file,
write answer:
"file ok
"file-size: 234
\r\n"
mmap the file to addr
writen(socked_fd, addr, 234)
-- with the tcpdump I can see the data send and get ack
close(socket_fd)
клиент:
read the anser head to get the file size
create a file and mmap
readn(socket_fd, addr, 234) -- error here
в readn заблокирован в строке «read» и не может прочитать последние 52 байта данных.
когда сервер закрыт. читать возврат 0.
если сервер отправляет некоторые данные (> 52) после записи в файл .client может вернуть файл нормально.
Как я могу прочитать все данные? или какая-то конфигурация системы допустила ошибку чтения?
Очень спасибо. И извините за мой плохой английский.
readn:
ssize_t readn(int fd, void *vptr, size_t n)
{
size_t nleft;
ssize_t nread;
char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ( (nread = read(fd, ptr, nleft)) < 0) {
if (errno == EINTR)
nread = 0; /* and call read() again */
else
return(-1);
} else if (nread == 0)
break; /* EOF */
nleft -= nread;
ptr += nread;
}
return(n - nleft); /* return >= 0 */
}