文件传输应用程序

时间:2012-01-25 07:58:53

标签: c linux sockets

大家好我想问一个关于使用套接字进行文件传输的问题。连接后我创建了客户端服务器代码我在客户端打开文件并开始读取数据并将数据发送到服务器。服务器打开一个文件,从套接字读取该数据并将其写入文件。它工作正常但现在我希望我的文件名在两边都应该相同。为了实现这一点,我已经将文件名从客户端发送到服务器,但问题是服务器读取文件名并读取一些数据并生成错误的文件名。

例如

file name: myfile.txt
data in the file is : hello how are you.


server create the file name myfile.txthellow how  

我怎么能避免这种情况,因为我不知道服务器大小的文件名是多少 感谢

3 个答案:

答案 0 :(得分:1)

您必须将文件名的长度发送到服务器。有两种方法可以做到这一点:

  • 明确地发送文件名的长度,然后将文件名发送到服务器。
  • 通过使用特殊字符终止文件名来隐式发送长度,通常为nul('\ 0'或0字节)

另外,请注意单个recv调用可能会读取另一侧多个send发送的数据:这就是TCP的工作方式(TCP是面向流的协议):不要假设在一个send命令中发送的数据将在一个recv中到达。一个recv可以从一个或多个send命令获取数据,并且可以在单个send命令中接收来自一个或多个recv命令的数据。 (而且你也可能得到“半个send”。

答案 1 :(得分:0)

有几种选择:

  1. 在文件名后面发送一个特殊字符(例如NUL\n)。
  2. 使用文件名长度(以字节为单位)作为前缀。
  3. 在接收端,文件名和数据都将作为单个字节流到达。但是,服务器现在有足够的信息来确定文件名的结束位置和数据的开始位置。

答案 2 :(得分:0)

您可以使用两种类型的消息定义自定义协议:一种类型用于文件名,另一种用于数据。每条消息由第一个字节组成,表示其类型(标题),其余字节包含文件名或数据(正文)。