c ++文件传输

时间:2011-12-03 17:51:33

标签: c++ sockets

我在从客户端向服务器发送文件时遇到问题。当我发送文本文件时,它没问题。但是当我尝试发送二进制文件时,我只收到文件的一部分或应用程序崩溃。我喜欢一些代码,它适用于二进制传输。我使用WinSock,我SOCKET指向服务器,SOCKET指向客户端。我已经尝试了几乎所有的东西,请帮助一下 任何回复的Thanx。

编辑: 我没有来源。我需要帮助发送exe文件的变化比sendig txt。转换?我打开它作为bin,但它没有帮助。

EDIT2: @thkala: 这是非常具体的。我想我做了所有3个可能的错误,我使用了getline()并在0字节终止,所以可能是这个。如果没有getline(),该怎么用?我打开任何liblary使用文件,我现在使用fstream。

2 个答案:

答案 0 :(得分:2)

文本和二进制文件之间的一些显着差异,可能会或可能不会让您失望:

  • 文本文件通常具有,由行终止符分隔。对二进制文件使用面向行的函数可能会以各种有趣的方式失败。

  • 作为前一点的后续内容,无保证二进制文件甚至包含单行终止符。这种差异往往会破坏代码,无意中假设一行不能超过X个字符,然后继续根据该假设分配内存,然后进入整个输入。无论X有多大,总会有一个更大的文件。顺便说一句,这样的代码通常也会破坏机器生成的文本文件,行长很长。

  • 通常假定文本文件不包含零字节,而二进制文件通常不包含零字节。由于零字节是C风格字符串的终止指示符,因此当由面向文本的函数处理时,二进制内容往往会被破坏。即使各种函数的宽字符版本也会破坏,因为它们只在特定位置期望零字节。

除非您发布一些代码,否则无法提供比此更具体的帮助。

答案 1 :(得分:0)

使用fread()ReadFile()或类似函数将文件中的一大块数据读入内存缓冲区,send()缓冲区上的缓冲区,然后根据需要重复直到整个文件已被阅读。如果您不介意使用特定于Microsoft的功能,那么您也可以使用CreateFile()打开文件,然后使用TransmitFile()让WinSock通过套接字为您发送文件,这样您就没有了手动阅读。