gpt4 book ai didi

c++ - ftp客户端--get后插入随机字符

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:19 26 4
gpt4 key购买 nike

我正在用 C++ 创建一个 FTP 客户端。

使用我的 ftp 客户端下载一个更大的文件后。我看到随机字符被添加到文件中。

image

在图中,protocol变成了pr¿_ÿotocol,它们也被插入到同一个文件的许多其他地方。

我注意到:

  • 当我更改缓冲区大小时,这些字符会发生变化,有时是 \377,或者一个反斜杠后跟 3 位数字

  • 当缓冲区大小减小时,它们变得更加频繁

我确保使用图像模式。可能是什么原因造成的?

我在 TCPSocket 中的读取代码:

stringstream TCPSocket::long_read()
{
pollfd ufds;
ufds.fd = sd;
ufds.events = POLLIN;
ufds.revents = 0;
ssize_t bytesRead = 0;
stringstream result;
char buf[BUFF_SIZE];
do {
bzero(buf, BUFF_SIZE);

bytesRead = ::read(sd, buf, BUFF_SIZE);
if (bytesRead == 0) {
break;
}
if (bytesRead > 0) {
result << buf;
}
} while (poll(&ufds, 1, 1000) > 0);
return result;
}

我在Main.cpp中获取代码

 else if (command == command::GET) {
string filename;
cin >> filename;
string dataHost;
int dataPort;
if (enterPasiveMode(dataHost, dataPort)) {
dataSocket = new TCPSocket(dataHost.c_str(), dataPort);
if (fork() == 0) {
stringstream result = dataSocket->long_read();

ofstream ofs;

ofs.open(filename);
if (ofs.is_open()) {
copy(istreambuf_iterator<char>(result), istreambuf_iterator<char>(), ostreambuf_iterator<char>(ofs));

ofs.close();
}
else {
cout << "open failed";
}
break;
}
else {
writeAndImmediateRead(rfc959::TYPE_I);
controlSocket->write(rfc959::RETRIVE(filename));
string result = controlSocket->read();
cout << result;
int reply = Parser::firstDigit(result);

// I'll remove incomplete local file if request fails
if (reply != rfc959::POSITIVE_PRELIMINARY_REPLY) {
remove(filename.c_str());
continue;
}

wait(NULL);
cout << controlSocket->long_read().str();
}
}
}

最佳答案

从你的“long_read”函数:

char buf[BUFF_SIZE];
...
bytesRead = ::read(sd, buf, BUFF_SIZE);
...
result << buf;

buf 是一个 char[]这意味着当用作字符串时,数据预计以 \0 结尾.这本身意味着 <<不需要添加 bytesReadresult但直到第一个 \0 .根据数据,这可能在 bytesRead 之前甚至之后,在这种情况下,您会从未初始化的 buf 中获取数据直到找到一些 \0 .这\0甚至可以在外面buf .

或者简而言之:不要混合使用字符串语义(char[]<<、...)和八位字节语义(::read(...))。

关于c++ - ftp客户端--get后插入随机字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35954764/

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