读书人

TransmitFile 发送后客户端怎么接收

发布时间: 2013-01-25 15:55:29 作者: rapoo

TransmitFile 发送后,客户端如何接收?
本帖最后由 VisualEleven 于 2013-01-04 17:19:32 编辑 下面是服务器端的代码如下,是从网上找的一个例子,这段代码返回值为1,不知道发送是否成功了,感觉应该是发送成功了,

BOOL TransFile(IDBVisit_Processor *pObj, PPRE_IO_DATA pIoData,PPRE_SOCKET_DATA pSocketData,DWORD dwNameLen)
{
//这一句是为nc做的,你可以修改它
pIoData->Buffer[dwNameLen-1]='\0';

strcpy(pIoData->Buffer,"E:\\1.txt");
HANDLE hFile=CreateFileA(pIoData->Buffer,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
BOOL bRet=FALSE;
if(hFile!=INVALID_HANDLE_VALUE)
{
cout<<"Transmit File "<<pIoData->Buffer<<" to client"<<endl;
pIoData->IoType=IoTransFile;
memset(&pIoData->oa,0,sizeof(OVERLAPPED));
*reinterpret_cast<HANDLE*>(pIoData->Buffer)=hFile;
//TransmitFile(pSocketData->hSocket,hFile,GetFileSize(hFile,NULL),PRE_SEND_SIZE,reinterpret_cast<LPOVERLAPPED>(pIoData),NULL,TF_USE_SYSTEM_THREAD);
TransmitFile(pSocketData->hSocket,hFile,0,PRE_SEND_SIZE,reinterpret_cast<LPOVERLAPPED>(pIoData),NULL,TF_USE_SYSTEM_THREAD);
bRet=WSAGetLastError()==WSA_IO_PENDING;
}
else
cout<<"Transmit File "<<"Error:"<<GetLastError()<<endl;
return bRet;
}

客户端接收到代码如下:
 char recvbuf[1024];
while( bytesRecv == SOCKET_ERROR )
{
memset(recvbuf, 0,sizeof(recvbuf));
bytesRecv = recv( ConnectSocket, recvbuf, 1024, 0 );
if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET )
{
printf( "Connection Closed.\n");
break;
}

}

这段代码接收不到任务内容,不知道是什么地方有问题?请高手指点一下。
但是如果服务器是用
WSASend(pPreHandleData->hSocket,&pPreIoData->DataBuf,1, &dwRecv,dwFlags, reinterpret_cast<LPWSAOVERLAPPED>(pPreIoData),NULL);

发送的普通的字符串,是可以接收到的。

还有如果文件很大,比如10k,我的接收代码应该怎么写?


[解决办法]
你是不是用重叠IO的方式?如果是阻塞方式TransmitFile几行代码就写出一个了
只有看你代码调试下才能知道原因的,你这几行代码怎么看
liqisong611@hotmail.com

读书人网 >VC/MFC

热点推荐