linux下socket如何传输一个目录以及目录下的子文件子目录

将客户端的一个给定的目录传到服务器端,该目录一起起子目录文件一并传过去~要怎么实现?

socket编程,需要一个服务器端和一个客户端
传输文件夹的话可以在服务器端进行发送在客户端进行接收
方法是,在指定端口建立侦听,比如8888,使用的协议可以是tcp/ip或者udp/ip
udp是种无链接不可靠的协议,建议传输文件还是使用tcp协议
客户端通过connect函数连接服务器端后就可进行数据传输

其实文件传输本质就是数据传输,我们在服务器端只需要使用opendir函数“打开”文件夹
再使用readdir函数遍历文件夹即可,将所有读到的文件名进行判断,比如判断该文件是否为文件夹,或者是否会特殊文件,比如软链接,socket文件,管道文件等等,如果是文件夹则进行该文件夹进行递归(即进入该文件夹后施行前面相同的方法,以此类推下去,直到读取完所有的文件夹),并将该文件夹名称发送给客户端,客户端接收到该文件夹名称后使用mkdir函数创建一个文件夹,如果为一般文件将该文件名和所在目录发送到客户端,客户端创建该文件(如果是多级文件夹则客户端则进入文件夹)读取该文件(fopen或者open),可以一边读取文件内容一边将读取的内容发送给客户端,客户端则将接收到的内容写入到文件即可

这里需要注意的就是服务器端与客户端需要规划好一定的规则,也就是需要建立一个简单的服务器与客户端通信的协议
比如最简单的我们使用 文件类型:文件名 来表明传输的数据的意义
服务器端在检查文件夹内的文件时通过不同的文件类型来制定不同的标签,客户端通过检测这些标签来确定下一步的操作
比如服务器检测到一个文件夹则会发送 文件夹:该文件夹的名称
客户端在接收到该数据后进行解析,解析到冒号前的文件类型为文件夹则创建一个冒号后的文件夹名称(这里文件夹名称包括多级目录,我们也可以设置的更完善点,比如 文件类型:文件夹:文件夹:文件夹,最后一个文件夹名称则为客户端需要创建的文件夹,前面的则是该文件夹所在的绝对路径)
有了这种简明的协议就可以更好地完成socket文件夹复制工作
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-05
最简单的方法:借助tar工具和管道。

tar知道吗?可以把一整个文件夹打包成一个文件的工具,也可以还原
不仅可以打包成一整个文件,还能打包成数据流。
用它打包成数据流的模式。
配合popen调用

FILE* tarData = popen("tar -c /home/sorayuki/pics", "rb"); //读取数据
for(;;) {
char buffer[1024];
int r = fread(buffer, 1, 1024, tarData);
if (r <= 0) break;
//把buffer中前r个字节通过套接字发过去
}
pclose(tarData);

接收端类似,
FILE* tarData = popen("tar -x -C /home/sorayuki2", "wb");
for(;;) {
char buffer[1024];
//这里收数据存入buffer
//如果收完了(recv返回0)就break
fwrite(buffer, 1, 收到数据的长度, tarData);
}
pclose(tarData);

代码是设想,未经测试。实现起来有困难可以再追问追问

不懂tar 也不懂popen...设想用递归。可是太麻烦了。

追答

对,就是因为太麻烦了所以才让你用tar的。
popen简单说就是把一个程序的输出当作文件来读,比如ls可以列出一个文件夹下的所有文件,
那么
FILE* fp = popen("ls", "r");
以后,从fp里面读取数据,就和读取一般文件一样,能读到一个文件夹下的所有文件的列表(字符串格式)

关于tar的使用,很容易,你可以上网搜一下,然后自己尝试一下 tar -cf 和 tar -xf 这样的,然后再尝试一下 tar -c 和 tar -x 配合输入输出重定向(就是 > 和 < 符号),这两个学起来……应该一个半天内可以搞定?

popen和tar弄会以后,就可以直接用popen从tar的输出读数据,然后用同样的方法还原数据。

tar其实就是这么一个工具,相当于你用的那些什么压缩软件,可以把一堆文件打包成一个文件的,只是它只管打包解包不管压缩解压。我的想法就是tar打包以后发过去,对方收到后用tar解包。只是省去了中间存文件的步骤

为了方便理解:
本来是这样:
发送端:一堆文件——tar打包——一个文件——传到对方
接收端:收到数据——存成文件——tar解包——一堆文件

现在是这样
发送端:一堆文件——tar打包——传到对方
接收端:收到数据——tar解包——一堆文件

本回答被提问者采纳