0

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

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

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

4

3 回答 3

2

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

于 2011-04-22T16:26:41.343 回答
2

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

否则,有多种选择,包括但不限于以下几种:

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

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

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

于 2011-04-22T18:00:16.840 回答
0

您还可以根据 MSDN查看CSocketFile

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

于 2011-04-22T18:36:34.023 回答