我基本上使用的是一个 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;
}
请帮忙,这没有意义...