gpt4 book ai didi

c++ - 从客户端向服务器传输文件时缺少字节,字节值也代表一些控制字符

转载 作者:行者123 更新时间:2023-11-28 07:27:09 45 4
gpt4 key购买 nike

我正在编写文件传输客户端/服务器应用程序其中客户端在windows7上运行,用vb.net编写并且服务器在 linux mint 上运行并用 c++ 编写(我正在使用 vmware)我的问题是当我尝试将文件上传到服务器(如图像)时,接收到的数据丢失了许多字节,这些字节也代表控制字符(如 EOT、ETB 等),我猜它们被读取为 tcp控制字符并被接收操作系统忽略。我已经使用简单的文本文件(最大 4MB)测试了应用程序,没有任何问题。有没有办法防止系统忽略这些字节?

这是接收文件的c++函数:

string readSockBytes(int port,int num,int size)
{
int dcmbuffSize = 1460;
int n;
stringstream temp;
string strBuffer,Sbuffer;
char Rbuffer[dcmbuffSize];
struct socketVar sockets;
sockets = setSocket(port);
sockets = sockListen(sockets);
cout<<"user connected\n";
strBuffer = readsock(sockets);
cout<<strBuffer.substr(0,strBuffer.find("$"))<<endl;
if(num == atoi(strBuffer.substr(0,strBuffer.find("$")).c_str()))
Sbuffer = "ready$";
else
{
Sbuffer = "exit$";
close(sockets.newsockfd);
close(sockets.sockfd);
}
n = writesock(sockets, Sbuffer, 100);
if (n < 0) error("ERROR writing to socket");
while(strBuffer.length() < fileSize)
{
n = read(sockets.newsockfd,Rbuffer,dcmbuffSize-1);
if (n < 0) error("ERROR reading from socket");
temp.str(Rbuffer);
strBuffer = strBuffer+temp.str();
}
strBuffer = strBuffer.substr(0,size);
return strBuffer;
}

最佳答案

问题很可能是您发送了二进制数据。二进制数据可以包含零。零是普通的字符串终止符。

这意味着当你执行 temp.str(Rbuffer)(假设 temp 是一个 std::stringstream)时,它只会得到Rbuffer 中的数据,直到第一个零。

而不是使用例如std::stringstream 使用 std::string:

while(strBuffer.length() < fileSize)
{
char buffer[2048];

ssize_t n = read(sockets.newsockfd, buffer, sizeof(buffer));
if (n <= 0)
{
// An error, or connection closed
if (n < 0)
error("ERROR reading from socket");
break;
}

// Create a string of `n` bytes, including possible string terminators
// and add it to out current buffer
strBuffer += std::string(buffer, n);
}

这里要记住的重要一点是,您不能将接收到的数据用作字符串!如果它是二进制数据,它肯定会包含字符串终止符,因此您必须将它视为二进制数据而不是字符串(即使您可以将其存储在 std::string 中)。

您还需要注意,您无法打印数据,因为许多二进制值要么无法打印,要么将打印为“垃圾”。

最后,如果你读写二进制文件,你需要以二进制模式打开它们,否则你会得到字节 0x0d0x0a 的错误(即回车和换行)。

关于c++ - 从客户端向服务器传输文件时缺少字节,字节值也代表一些控制字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18566593/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com