Я не могу прочитать последние байты данных из сокета - PullRequest
0 голосов
/ 18 августа 2011

Я пишу сервер и клиент. Так же, как 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 */

}

...