我在从客户端向服务器发送文件时遇到问题。当我发送文本文件时,它没问题。但是当我尝试发送二进制文件时,我只收到文件的一部分或应用程序崩溃。我喜欢一些代码,它适用于二进制传输。我使用WinSock,我SOCKET
指向服务器,SOCKET
指向客户端。我已经尝试了几乎所有的东西,请帮助一下
任何回复的Thanx。
编辑: 我没有来源。我需要帮助发送exe文件的变化比sendig txt。转换?我打开它作为bin,但它没有帮助。
EDIT2: @thkala: 这是非常具体的。我想我做了所有3个可能的错误,我使用了getline()并在0字节终止,所以可能是这个。如果没有getline(),该怎么用?我打开任何liblary使用文件,我现在使用fstream。
答案 0 :(得分:2)
文本和二进制文件之间的一些显着差异,可能会或可能不会让您失望:
文本文件通常具有行,由行终止符分隔。对二进制文件使用面向行的函数可能会以各种有趣的方式失败。
作为前一点的后续内容,无保证二进制文件甚至包含单行终止符。这种差异往往会破坏代码,无意中假设一行不能超过X个字符,然后继续根据该假设分配内存,然后进入整个输入。无论X有多大,总会有一个更大的文件。顺便说一句,这样的代码通常也会破坏机器生成的文本文件,行长很长。
通常假定文本文件不包含零字节,而二进制文件通常不包含零字节。由于零字节是C风格字符串的终止指示符,因此当由面向文本的函数处理时,二进制内容往往会被破坏。即使各种函数的宽字符版本也会破坏,因为它们只在特定位置期望零字节。
除非您发布一些代码,否则无法提供比此更具体的帮助。
答案 1 :(得分:0)
使用fread()
,ReadFile()
或类似函数将文件中的一大块数据读入内存缓冲区,send()
缓冲区上的缓冲区,然后根据需要重复直到整个文件已被阅读。如果您不介意使用特定于Microsoft的功能,那么您也可以使用CreateFile()
打开文件,然后使用TransmitFile()
让WinSock通过套接字为您发送文件,这样您就没有了手动阅读。