【发布时间】:2014-12-03 21:21:39
【问题描述】:
我正在尝试编写一个基本的文件服务器,它从客户端获取文件名并通过通过 TCP 向客户端发送数据来响应。我有一个大部分工作的客户端和服务器应用程序,但我观察到一些奇怪的行为,请考虑以下
while ((num_read = read (file_fd, file_buffer, sizeof (file_buffer))) > 0)
{
if (num_read != write (conn_fd, article_buffer, num_read))
{
perror ("write");
goto out;
}
}
out:
close(file_fd); close(sub_fd);
file_fd 是通过网络发送的文件的文件描述符,conn_fd 是connect()ed TCP 套接字的文件描述符。
这似乎适用于小文件,但是当我的文件变大(兆字节+)时,文件末尾的一些不一致的数据量似乎将无法传输。
我怀疑写入后的立即 close() 语句可能与它有关,因此我在两个 close() 语句之前尝试了 1 秒 sleep(),我的客户成功收到了所有数据。
有没有比在服务器端执行sleep() 更好的方法来处理这个问题?
【问题讨论】:
-
这里演示的是客户端代码还是服务端代码?
-
fsync(2)怎么样? -
我试过 fsync() 并没有解决问题。
-
我认为您还有其他问题。除非网络中断,否则 TCP 套接字不会像那样丢弃数据。
-
您也应该检查
read()和close()的返回值(特别是-1 和它的errno)。不仅在这种情况下,而且在一般情况下。
标签: c sockets tcp network-programming file-descriptor