大侠们:
你们好!
我最近在做一个类似于svn文件同步功能的模块.
有几个问题不太明白.
1. 服务器端要向客户端发送一个结构体数组,socket里的send 和 recv 只能处理char型的二进制数据,把结构体数组强制转换一下,然后发送出去,这中间要注意哪些问题.比如结构体要不要设置字节对齐,结构体中能不能有不定长度的std::string类型的成员什么的.
2.服务器端每次要发送多个文件.发完第一个文件,再发第二个文件.怎么让客户端知道第一个文件已经发完了.有没有无缝的完美的方案.我不想在发送完一个文件后,再发送一个什么标识符,告诉客户端一个文件已经传完了,准备接收第二个文件.
3.在发送文件的过程中,发送和接收的缓冲区有没有大小限制;可不可以一次把一个文件全部读到缓冲区,然后一次发送出去.
谢谢
你们好!
我最近在做一个类似于svn文件同步功能的模块.
有几个问题不太明白.
1. 服务器端要向客户端发送一个结构体数组,socket里的send 和 recv 只能处理char型的二进制数据,把结构体数组强制转换一下,然后发送出去,这中间要注意哪些问题.比如结构体要不要设置字节对齐,结构体中能不能有不定长度的std::string类型的成员什么的.
2.服务器端每次要发送多个文件.发完第一个文件,再发第二个文件.怎么让客户端知道第一个文件已经发完了.有没有无缝的完美的方案.我不想在发送完一个文件后,再发送一个什么标识符,告诉客户端一个文件已经传完了,准备接收第二个文件.
3.在发送文件的过程中,发送和接收的缓冲区有没有大小限制;可不可以一次把一个文件全部读到缓冲区,然后一次发送出去.
谢谢
2,每发送一个文件,建议发送三个数据包过去,第一个发送文件名和文件长度(便于服务器恢复文件和判断文件是否接受完全),第二个发送文件数据,第三个发送文件发送结束标志(告诉服务器文件发送完毕)。
3,,发送和接收的缓冲区都有个默认值,这个值到底是1024K还是8096K记不清了,但不管多大,你根本不可能一次把一个文件都放入缓冲区的,随便一个电影都几百M呢,肯定是循环发送,服务器循环接受。那服务器如何知道你发完了并且自己接受完了呢,这就要用到我上边说的发送的第一个数据包的文件长度了,当服务器接受到那么对数据时,就知道接受完了,这是紧接着客户端又发过去个结束标志,服务器就更明白了。
以上就是一个文件的完整发送过程!!
参看《精通Windows Sockets网络开发--基于VC++实现》,上面有很完整的例子,很不多的,而且支持多线程发送!O(∩_∩)O哈哈~,希望对你有帮助!!
我要遍历发送多个文件,每个文件名是一个字符串,用char[]的话不好遍历,所以我想用std::string,或者其他封装好的字符串类.只能用char[]才能保证安全吗
2. 最好要有结束标志,这是服务器和客户端之间的协议命令。
3. 文件传输的基本方法是分块读取文件进行发送,你这样做对大文件很难实现。
2。服务器端每次要发送多个文件,我通常都是把它打包,然后用用断点传输,或多线程传输去解决(这些都是比较常用传输文件方法)。可以在数据包中定义一个标准,告诉Client发完
3.可以修改缓冲区,但好像有限制