我尝试使用 Winsock 制作文件下载器,但我意识到如果 Internet 连接速度较慢,客户端会收到一些不需要的数据以及服务器发送的数据。
所以我做了一个简单的测试:
我从服务器发送从 1 到 30000 的数字:
char* buf = (char*)malloc(BUFLEN);
for( int i = 0;i < 30000;++i ){
ZeroMemory(buf, BUFLEN);
itoa(i+1, buf, 10);
send(current_client, buf, BUFLEN, 0);
}
free(buf);
客户端接收并保存它们:
char *buf = (char*)malloc(DEFAULT_BUFLEN);
ofstream out;
out.open(filename, ios::binary);
for( int i = 0;i < 30000;++i ){
ZeroMemory(buf, DEFAULT_BUFLEN);
recv(ConnectSocket, buf, DEFAULT_BUFLEN, 0);
out.write(buf, DEFAULT_BUFLEN);
out << endl;
}
out.close();
free(buf);
我希望在文件中看到类似的内容:
1
2
3
4
...
30000
但是有一些额外的数据包,包含“/0”,传输并且文件看起来像这样:
1
2
3
4
5
6
...
2600
如果我尝试跳过“/ 0”数据包,来自服务器的数据也会像这样跳过:
1
2
3
4
5
6
9 <- 7 和 8 丢失
...
2600
我做错了什么?