我无法读取socket中的最后一个字节数据

时间:2011-08-18 17:36:47

标签: sockets tcpclient

我写了一个服务器和一个client.just就像HTTP一样。客户端从服务器请求文件。

但在客户端,我无法读取socket.until中的最后一个数据,服务器写入文件完成并关闭(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。

如果服务器在写完file.client之后发送一些数据(> 52),可以将文件恢复正常。

如何阅读整个数据?或某些系统配置让读错误?

非常感谢。抱歉我的英语不好。

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 */

}

0 个答案:

没有答案