gpt4 book ai didi

C++/TCP数据传输垃圾

转载 作者:可可西里 更新时间:2023-11-01 02:52:40 25 4
gpt4 key购买 nike

我是一名初学者 C++/TCP 程序员,我正在做一个在 C++/VS2010/Windows 7 中使用 TCP 进行文件传输的家庭作业。

我已经创建了一个客户端和一个可以监听网络上多个客户端的服务器。当我向请求文件的服务器发送请求时,我收到了正确大小的文件,但是当我将数据从服务器发送到客户端时,我得到了垃圾。

我很确定我在类型转换的某个地方犯了一个愚蠢的错误,但无法确定在哪里。我正在逐字节发送 char* 并将它们保存到客户端的文件中。

有什么问题吗?

// client code: 
unsigned int packlen = 0;
unsigned int flength = 0;
char* data = NULL;
if((packlen = recv(sock, (char*) &flength, sizeof(unsigned int), 0)) ==
sizeof(unsigned int))
{
flength = (unsigned int) flength;
data = new char[flength];
}
unsigned char current;
char* buffer;
unsigned int accumlength = 0;

for(unsigned int i = 0; i < flength; ++i)
{
if((packlen = recv(sock, (char*) &current , sizeof(unsigned int), 0))
!= sizeof(unsigned int))
{
err_sys("Receiving packet transfer error., exit");
}
data[i] = current;
}
ofstream output(argv[2], ios::binary);
output.write(data, flength);
if(data)
{
delete[] data;
data = NULL;
}


// Server code:
char* data = NULL;
unsigned long length;
string fname;

data = new char[stat_buf.st_size];
ifstream input(reqp->filename, ios::binary);
input.seekg(0, ios::end);
unsigned int length = input.tellg();
if(length != stat_buf.st_size)
{
err_sys("Problems with file size");
}

send(cs, (char*) &length, sizeof(unsigned int), 0);
Sleep(1000); // wait a bit

input.read(data, length); // read all file at once.
for(unsigned int i = 0; i < length; ++i)
{
unsigned char current = data[i];
send(cs, (char*) &current, sizeof(unsigned char), 0);
}

感谢您的帮助。

最佳答案

看起来您在读取循环期间丢弃了相当多的字节:

recv(sock, (char*) &current, sizeof(unsigned int), 0)

其中 current 是一个 unsigned char 但你要求它读取 sizeof(unsigned int) 字节,这比这更多。所以 recv() 会将其结果写入其他地方(因为它将在 current 中写入 4 个字节)

你可能应该这样写:

recv(sock, (char*) &current, 1, 0)

尽管这非常低效,但至少应该可行。

关于C++/TCP数据传输垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12884681/

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