如何解决通过套接字 C++ 发送 XML 文件
std::ifstream f;
f.open(filePath,std::ios::binary | std::ios::ate);
int fileSize = f.tellg();
char *bytes = new char[fileSize];
f.read((char *) bytes,fileSize);
send(clientSocket,std::to_string(fileSize).c_str(),16,0);
send(clientSocket,bytes,fileSize,0);
f.close();
delete [] bytes;
尽管被打开并且文件的大小被正确计算,但在调试时,我看到
f.read((char *) bytes,fileSize); f: std::ifstream fileSize:2328 bytes: 0x6824b0 "\r\360\255\272 ...
顺序
\r\360\255\272
进一步重复并最终以
结束\r\360\255\272\253\253\253\253\253\253\253\253\253\253\253\253\253\253\253\253\356\376\356\ 376\356\376",
如何通过 WinSock2_32
正确传递和接收任何 xml 内容?
解决方法
在读取字节之前,您没有将文件流返回到位置 0,因此 f.read()
将失败。预先添加对 f.seekg(0)
的调用。
此外,您应该以二进制格式发送 fileSize
,而不是作为字符串,特别是因为字符串的长度不是 16 个字节。
试试这个:
std::ifstream f(filePath,std::ios::binary | std::ios::ate);
if (!f.is_open()) ...
int fileSize = f.tellg();
if (fileSize < 0) ...
char *bytes = new char[fileSize];
f.seekg(0);
f.read(bytes,fileSize);
int32_t tmp = htonl(fileSize);
send(clientSocket,&tmp,sizeof(tmp),0);
send(clientSocket,bytes,fileSize,0);
delete [] bytes;
f.close();
如果您绝对需要将 fileSize
作为 16 个字符的字符串发送,请为此使用格式化的 char[]
缓冲区,例如:
std::ifstream f(filePath,fileSize);
char s_fileSize[17] = {};
sprintf(s_fileSize,"%0.16d",fileSize);
send(clientSocket,s_fileSize,16,0);
delete [] bytes;
f.close();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。