大侠们:
    你们好!
    我最近在做一个类似于svn文件同步功能的模块.
    有几个问题不太明白.
    1. 服务器端要向客户端发送一个结构体数组,socket里的send 和 recv 只能处理char型的二进制数据,把结构体数组强制转换一下,然后发送出去,这中间要注意哪些问题.比如结构体要不要设置字节对齐,结构体中能不能有不定长度的std::string类型的成员什么的.
    2.服务器端每次要发送多个文件.发完第一个文件,再发第二个文件.怎么让客户端知道第一个文件已经发完了.有没有无缝的完美的方案.我不想在发送完一个文件后,再发送一个什么标识符,告诉客户端一个文件已经传完了,准备接收第二个文件.
    3.在发送文件的过程中,发送和接收的缓冲区有没有大小限制;可不可以一次把一个文件全部读到缓冲区,然后一次发送出去.
     谢谢

解决方案 »

  1.   

    1,不用考虑字节对齐的问题,操作系统会自动对齐,最好不要有std::string类型的东东,如果是字符串, 设个char[],这样绝对安全。
    2,每发送一个文件,建议发送三个数据包过去,第一个发送文件名和文件长度(便于服务器恢复文件和判断文件是否接受完全),第二个发送文件数据,第三个发送文件发送结束标志(告诉服务器文件发送完毕)。
    3,,发送和接收的缓冲区都有个默认值,这个值到底是1024K还是8096K记不清了,但不管多大,你根本不可能一次把一个文件都放入缓冲区的,随便一个电影都几百M呢,肯定是循环发送,服务器循环接受。那服务器如何知道你发完了并且自己接受完了呢,这就要用到我上边说的发送的第一个数据包的文件长度了,当服务器接受到那么对数据时,就知道接受完了,这是紧接着客户端又发过去个结束标志,服务器就更明白了。
    以上就是一个文件的完整发送过程!!
    参看《精通Windows Sockets网络开发--基于VC++实现》,上面有很完整的例子,很不多的,而且支持多线程发送!O(∩_∩)O哈哈~,希望对你有帮助!!
      

  2.   


    我要遍历发送多个文件,每个文件名是一个字符串,用char[]的话不好遍历,所以我想用std::string,或者其他封装好的字符串类.只能用char[]才能保证安全吗
      

  3.   

    要确保缓冲区不溢出,必须使用较大的char[len]来发送字符串,根据std::string的长度来定义缓冲区大小,注意字符串截止符,然后进行拷贝。或者获得string的buffer地址,将其直接发送出去。若将其作为结构的一个域,则其实质上是一个字符串地址,对接收方没有意义
      

  4.   

    我同意4楼的,我没见过用string传的,用string的函数库处理,然后最后放入char[]中传输,这样挺好
      

  5.   

    1. 都看做字节流即可。 BYTE buf[1024 * 5] = {0];
    2. 最好要有结束标志,这是服务器和客户端之间的协议命令。
    3. 文件传输的基本方法是分块读取文件进行发送,你这样做对大文件很难实现。
      

  6.   

    书估计够呛有电子版的,这本书挺新的,好像是08年出的,应该还没有电子版的,你去下随书代码吧,csdn上就有,代码上有可以直接运行的多线程文件传输代码,你研究一下就好了,是mfc+socket的代码,很不错的!
      

  7.   

    1.要注意缓冲区,防止缓冲区溢出之前我试过收不到完整的文件
    2。服务器端每次要发送多个文件,我通常都是把它打包,然后用用断点传输,或多线程传输去解决(这些都是比较常用传输文件方法)。可以在数据包中定义一个标准,告诉Client发完
    3.可以修改缓冲区,但好像有限制