C ++ / TCP数据传输垃圾

时间:2012-10-14 17:28:21

标签: c++ tcp

我是初学者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);
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

看起来你在读取循环期间丢弃了很多字节:

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

其中current是一个无符号字符,但是你要求它读取sizeof(unsigned int)个字节,而不是那个字节。因此recv()会将其结果写在其他地方(因为它会在current中写入4个字节)

你应该写:

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

即使这种效率非常低,但它至少应该起作用。