完成端口 WSASend问题...发送文件

叶恭介叶恭介 2012-11-26 12:03:58
以下是我做的其中一个函数,用来根据文件路径发送文件数据到客户端的。

先说问题:函数调用WSASend发送数据文件,像40多M的文件,函数只用了1秒都不到的时间(非阻塞的原因),这有可能吗?函数调用完后,只见客户端在不断的收啊收啊?所以这个我做的函数是不是有问题呢?客户端接收到的数据会不会出错呢?那我要怎么做发送文件的函数呢?

请大家帮我看看....

/***********************************************************
** 函数名称: BOOL CClientManager::sendFileToClient(CClientContext *pClient,CString &path)

** 功能描述: 发送文件到客户端

** 参 数: CClientContext *pClient 接受文件的客户端
CString &path 文件路径

** 返 回 值: 无
************************************************************/
BOOL CClientManager::sendFileToClient(CClientContext *pClient,CString &path)
{
DWORD dwStart = 0, dwStop = 0; //用来测试发送的文件所用的时间
dwStart = GetTickCount(); //开始发送的时间

HANDLE hFile=CreateFile(path,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL);

if (hFile==INVALID_HANDLE_VALUE)
{
CloseHandle(hFile);
return FALSE;
}

DWORD dwFileSize=GetFileSize(hFile,0);
if (dwFileSize==0xFFFFFFFF)
{
return FALSE;
}

char* fileData = new char[Memory_Max]; //读取文件的缓存。大小是2048

u_int nReadIndex = 0;//当前读序号

pClient->AsyncSendPacket(MSG_Photo_RequestData,(char*)&nReadIndex,FILELEN);//发送文件第1部分。AsyncSendPacket这个是调用客户端WSASend发送的,格式是我定的

nReadIndex += 1;

DWORD nSendTimes = dwFileSize / ReadFilePartSize + 2; //+2是因为0和1我有其它用途 0:开始 1:结束

DWORD nlTotal = 0; //当前读取文件长度
DWORD nlRead; //每次读取文件长度

BOOL readOk = TRUE;

while (nlTotal != dwFileSize)//满足发送文件的长度,则退出循环
{
nReadIndex++; //读取次数加1

ZeroMemory(fileData,Memory_Max);

nlRead = 0;

memcpy(fileData,(char*)&nReadIndex,FILELEN);

if ( nReadIndex < nSendTimes )
{
if( ReadFile(hFile,fileData+FILELEN,ReadFilePartSize,&nlRead,NULL) == 0)
{
readOk = FALSE;
}

}else{

DWORD last = dwFileSize - nlTotal; //文件数据最后一次

if( ReadFile(hFile,fileData+FILELEN,last,&nlRead,NULL) == 0)
{
readOk = FALSE;
}
}

if(pClient->AsyncSendPacket(MSG_Photo_RequestData,fileData,(u_short)(nlRead+FILELEN)) == FALSE) //发送文件数据
{
break;
}

nlTotal += nlRead; //增加已读文件长度
}

CloseHandle(hFile);

delete []fileData;

dwStop = GetTickCount();

#ifdef _DEBUG
afxDump<<"BEGIN:"<<dwStart<<"\n";
afxDump<<"END:"<<dwStop<<"\n";
afxDump<<"USE:"<<dwStop - dwStart<<"\n";
#endif

return readOk;
}
...全文
170 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
叶恭介叶恭介 2012-11-26
  • 打赏
  • 举报
回复
函数有点长,但拜托各位..
ShengFei01 2012-11-26
  • 打赏
  • 举报
回复
通常不会发送得这么快,怀疑你的send出了问题,即阻塞,这种情况要等到可以发送后再接着发。传送文件最好用FTP,这里有源码,自己看看吧: http://download.csdn.net/detail/geoff08zhang/4571358

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧