1

我基本上使用的是一个 20,480 字节的缓冲区,它是一个数据包结构。这是结构:

struct PACKET
{
    DWORD Header;
    char data[20480];
    bool eof;
};

我正在做的是一次读取 20,480 字节的文件并发送它,直到所有文件都发送完毕。我正在对一个 3MB 的文件进行测试,发送了大约 150 轮。

这是代码:

PACKET sc;
sc.Header = 0xB;
ifstream file("test.pdf", ios::ate | ios::binary | ios::in);
    DWORD fileSize = file.tellg();
    file.seekg(0, ios::beg)

    int counter = 20480;
    int rounds = fileSize / 20480 + 1;

和发送循环:

while (rounds != 0)
{
    sc.eof = false;

    file.read(sc.data, sizeof(sc.data));

    send(Slick.client, (char*)&sc, sizeof(sc), 0);

    file.seekg(counter + 1);
    counter = counter + 20480;

    rounds--;
    Sleep(1);

       if (rounds == 0) sc.eof = true;

    cout << "Left to send: " << rounds << endl;
}
file.close();
cout << "All data was sent!" << endl;

我在另一边使用异步套接字,所以我的问题是有时它会收到 140 个数据包,有时会收到 130、147、148 等,并且文件总是损坏。我究竟做错了什么?


这是另一面:

case PACKET_FILE:
                    {
                        if (isOpen == false)
                        {
                            isOpen = true;
                            file.open("tester.pdf", ios::binary | ios::out | ios::app);
                            file.write(pack.data, sizeof(pack.data));
                        }
                        else
                        {
                            if (pack.eof == true)
                            {

                                file.write(pack.data, sizeof(pack.data));
                                file.close();
                                MessageBox(NULL, "File Received", "LOL", MB_OK);
                                break;
                            }
                                file.write(pack.data, sizeof(pack.data));
                        }
                        countz++;
                        char bue[10];
                        itoa(countz, bue, 10);
                        SendMessage(hlabelPackets, WM_SETTEXT, NULL, (LPARAM)(bue));
                        break;
                    }

请帮忙,这没有意义...

4

1 回答 1

1

看起来问题在于套接字的设置。如果您使用 UDP,您将无法保证交付,并且它们不一定会按照您发送它们的顺序到达。

此外,即使到达文件末尾,您似乎也总是发送 20480 字节。这可能会导致接收端的文件最后出现垃圾。

于 2012-09-23T21:30:48.757 回答