跨平台多线程读取和写入的有关问题

跨平台多线程读取和写入的问题
我目前在设计一个win32/Linux的跨平台通信程序。现在从Linux下载文件到win32平台下。
单线程的代码是成功的。但为了应对大文件和缩短下载时间,我打算采用多线程处理。


//多线程下载,客户端的写入操作
DWORD WINAPI WriteFileThread(LPVOID lparam)
{
PWDP pWdp=(PWDP)lparam;
    UINT DataSize=0;
UINT BufSize=MAX_PATH;
BYTE *buff=new BYTE[BufSize];

memset(buff,0,BufSize);
char szDir[MAX_PATH]={0};
char szText[MAX_PATH]={0};
int recvlen=0;
long OffSet=0;


recvlen=recv(pWdp->s,szText,sizeof(szText),0);
if (SOCKET_ERROR==recvlen)
{
closesocket(pWdp->s);
return 0;//写入文件失败
}
DataSize=atoi(szText);
OffSet=DataSize*pWdp->index;
//设置块数据区间段起始位置为距离
//文件起始位置偏移
//OffSet个字符的位置
//LARGE_INTEGER Distance={0};
//Distance.QuadPart
SetFilePointer(pWdp->hFile,OffSet,0,FILE_BEGIN);
//_lseek((int)(pWdp->hFile),OffSet,SEEK_SET);
DWORD total;
UINT Capacity=0;
UINT Num=BufSize;

while(Capacity<DataSize)
{
if (DataSize-Capacity<BufSize)
{
Num=DataSize-Capacity;
}
recvlen = recv(pWdp->s,(char*)buff,Num,0);
if (SOCKET_ERROR==recvlen)
{
closesocket(pWdp->s);
return 0;
}
Capacity += recvlen;
//注意有时网络有阻塞行为,不一定Num=recvlen
::WriteFile(pWdp->hFile,buff,recvlen,&total,NULL);
memset(buff,0,BufSize);
}
delete [] buff;
return 1;
}

Linux下的读取线程操作

typedef struct ReadData_Parameter
{
int hFile;
DWORD DataSize;//DWORD我在Linux中进行了重定义使得它和windows下的意义一致
long OffSet;
int s;//端套接字描述符
}RDP,*PRDP;

//hFile是待读取文件的文件描述符
//DataSize是多线程处理区间数据段的大小
//如果OffSet的值是0,DataSize是整个文件大小
//则该函数直接读取整个文件的数据信息
int ReadData(int hFile,
DWORD DataSize,
long OffSet,int s)
{//OffSet是long int 类型
UINT BufSize=MAX_PATH;
BYTE *buff=new BYTE[BufSize];
memset(buff,0,BufSize);
char szText[MAX_PATH]={0};
UINT i;
/*
DWORD FileSize;
FileSize=GetFileSizeEx(srcDir);//获取文件大小
*/
//转移文件偏移量至指定位置
lseek(hFile,OffSet,SEEK_SET);
sprintf(szText,"%ld",DataSize);//DataSize=FileSize/10

if (SOCKET_ERROR==send(s,szText,sizeof(szText),0))
{
close(hFile);
shutdown(s,SHUT_RDWR);
return 0;
}
UINT total=(UINT)(DataSize/BufSize);
UINT count=DataSize%BufSize==0?total:total+1;

UINT Capacity=0;
UINT Num=BufSize;
for(i=0;i<count;++i)
{
if (DataSize-Capacity<BufSize)