传输大文件,双边居然都阻塞在各自的 recv 函数

传输大文件,双方居然都阻塞在各自的 recv 函数
想弄个传文件程序。
服务器先启动,等待接收文件,客户端后启动用来发送文件。双方用TCP连接好之后客户端先发送一个 LARGE_INTEGER 变量,变量中保存的是文件的大小。这个文件是光盘的压缩文件,右键属性显示1.48G。
发送完大小之后双方开始用 while  循环发送和接收,程序运行了大概20秒之后,双方都各自阻塞在自己的 recv 函数。

下面客户端发送完文件大小之后,服务器就进入 while 循环开始接收数据,把收到的数据写入文件,在给客户 send 回去 WriteFile 了多少字节, 客户端收到服务器 WriteFile 多少字节之后调用文件的 SetFilePointerEx,以便下次从那继续发送

下面是服务器端和客户端的代码和运行结果图
//服务器端(接收文件)

#include<Windows.h>
#include<iostream>
using namespace std;

const int iOneMBufferSize = 1024*1024;
char buffer[iOneMBufferSize];//一兆空间
void main()
{
setlocale(LC_ALL, "chs");
WSAData data;
WSAStartup(MAKEWORD(2,2),&data);
SOCKET s1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8888);
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
bind(s1, (SOCKADDR*)&addr, sizeof(addr));
listen(s1,100);
int len = sizeof(addr);
SOCKET s2 = accept(s1,(SOCKADDR*) &addr,&len);
if( s2 != INVALID_SOCKET )
wcout<<L"***** 有客户端连入 *****"<<endl;

LARGE_INTEGER i64FileSize, i64FileSizeCopy;
recv(s2,(char*)&i64FileSize, sizeof(i64FileSize), 0);
i64FileSizeCopy.QuadPart = i64FileSize.QuadPart;
wcout<<L"**** 文件大小是 "<< i64FileSize.QuadPart <<L"字节, 文件保存在C盘根目录下 ****"<<endl;
HANDLE hFile = CreateFile(L"C:\\接收文件.rar",
GENERIC_READ | GENERIC_WRITE,//读写权限
0,//不共享
0,//默认安全描述符
OPEN_ALWAYS,//存在就打开,不存在就创建
0,//Flags and Attributes
0);//hFileTemplate
if(hFile==INVALID_HANDLE_VALUE)
wcout<<L"**** 文件创建失败 ****"<<endl;
DWORD dwNumBytes;


while( i64FileSize.QuadPart>0)//这里的一堆wcout是为看出阻塞在哪
{
ZeroMemory(buffer, iOneMBufferSize);
wcout<<L"服务器准备接收文件"<<endl;
int size = recv(s2, buffer, iOneMBufferSize, 0);
wcout<<L"服务器收完文件"<<endl;
wcout<<L"服务器准写文件"<<endl;
WriteFile(hFile, buffer, size, &dwNumBytes, 0);
wcout<<L"服务器写完文件"<<endl;

wcout<<L"服务器准备发送 dwNumBytes"<<endl;
send(s2, (char*)&dwNumBytes, sizeof(DWORD), 0);
wcout<<L"服务器发完 dwNumBytes"<<endl;

i64FileSize.QuadPart -= dwNumBytes;

// wcout<<L"接收中\t";
}
wcout<<endl<<L"****接收完毕****"<<endl;
while(1)
{}
}


//客户端(发送文件)
#include<Windows.h>
#include<iostream>
using namespace std;

const int iOneMBufferSize = 1024*1024;
char buffer[iOneMBufferSize];//一兆空间
void main()
{
setlocale(LC_ALL, "chs");
WSAData data;
WSAStartup(MAKEWORD(2,2),&data);
SOCKET s1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8888);
char ip[100];
ZeroMemory(ip,100);
wcout<<L"输入对方IP: ";
cin>>ip;//这里输入 127.0.0.1
addr.sin_addr.S_un.S_addr = inet_addr(ip);
int e = connect(s1, (SOCKADDR*)&addr, sizeof(addr));
if(e==-1)
wcout<<L"connect 函数失败"<<endl;