我写了一个服务器和一个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 */
}