微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过套接字 C++ 发送 XML 文件

如何解决通过套接字 C++ 发送 XML 文件

我正在尝试通过以下方式发送 .ui 文件内容

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 举报,一经查实,本站将立刻删除。