使用C ++中的套接字进行文件传输

时间:2011-04-22 16:21:52

标签: c++ winsock2

我希望使用C ++语言使用套接字从客户端到服务器进行文件传输...

我只将代码传输到客户端和服务器。

如何传输文件?任何帮助或参考资料也会有所帮助。

3 个答案:

答案 0 :(得分:2)

将文件转换为字节流,并将其发送到套接字并在服务器上将其作为字节流读取。

答案 1 :(得分:2)

如果您可以使用特定于Winsock的解决方案,请查看TransmitFile()函数。 Linux和Solaris都有sendfile()函数,它们以类似的方式执行,但我相信Linux和Solaris的API sendfile()略有不同。这些功能提供了额外的好处,无需将文件内容复制到您的地址空间。

否则有几个选项,包括但不限于以下内容:

  • 将文件块读入缓冲区,并通过套接字发送该缓冲区。继续迭代文件,直到发送完成。请注意,您必须注意发送的字节数(即写操作的返回值),以确保数据中没有漏洞。
  • 内存将文件映射到进程地址空间,并直接从内存映射缓冲区写入套接字。这种方法使您不必将文件内容复制到流程中,因此在发送大文件时可以提高性能。但是,sendfile()TransmitFile()函数仍然会更快。与往常一样,对您的代码进行分析。

您可能想要考虑的另一件事是您是否希望套接字写操作是阻塞或非阻塞,并且在接收端也是如此。非阻塞IO将要求您使用平台的事件多路分解机制(例如POSIX平台上的select())。

Boost.Asio也可能会大大简化您的任务。如果可能的话,我建议在原生API上使用它。

HTH!

答案 2 :(得分:0)

您还可以查看CSocketFile  根据MSDN

CSocketFile 派生自CFile,但它不支持CFile成员函数,如定位函数(Seek,GetLength,SetLength等),锁定函数(LockRange, UnlockRange)或GetPosition函数。所有CSocketFile对象必须做的是写入或读取相关CSocket对象的字节序列。