我希望使用c++语言从客户端到服务器使用套接字进行文件传输…
我的代码只传输字符串到客户端和服务器。
如何传输文件?任何帮助或参考资料也会有所帮助。
如果您可以使用特定于winsock的解决方案,请查看TransmitFile()
函数。Linux和Solaris都有一个以类似方式执行的sendfile()
函数,尽管我相信Linux和Solaris有一个略有不同的sendfile()
API。这些函数提供了一个额外的好处,即不必将文件的内容复制到您的地址空间中。
否则有几个选项,包括但不限于:
- 将文件块读入缓冲区,并通过套接字发送该缓冲区。在文件上不断迭代,直到发送完成。请注意,你必须注意发送的字节数(即写操作的返回值),以确保你的数据中没有漏洞。
- 内存映射文件到您的进程地址空间,并直接从内存映射缓冲区写入套接字。这种方法使您不必将文件的内容复制到进程中,因此在发送大文件时可以提高性能。然而,
sendfile()
和TransmitFile()
函数仍然会更快。像往常一样,配置代码。
您可能要考虑的另一件事是,您是否希望套接字写操作是阻塞的还是非阻塞的,在接收端也是如此。非阻塞IO将要求您使用您的平台的事件解复用机制(例如,POSIX平台上的select()
)。
提振。Asio也可能极大地简化您的任务。如果可能的话,我建议使用它而不是本机api。
HTH !
将文件转换为字节流,并将其通过套接字发送,并在服务器上作为字节流读取。
您也可以查看CSocketFile根据MSDN
类CSocketFile派生自CFile,但它不支持CFile成员函数,如定位函数(Seek, GetLength, SetLength等),锁定函数(LockRange, UnlockRange)或GetPosition函数。所有CSocketFile对象必须做的就是向相关的CSocket对象写入或读取字节序列。