我想用winsock来传送文件,一下是CAsyncSocket服务器方的编程:
void CAsyncSocket::OnBtnListen()
{
// TODO: Add extra validation here
ListenSocket.Create(9000);
ListenSocket.Listen();
}void CAsyncSocket::OnAccept()
{
ListenSocket.Accept(ConnectedSocket);
}void CAsyncSocket::OnReceive()
{
BYTE dwValue;
CSocketFile *sw_file;
CArchive *sw_in;
// CArchive* dwValue;
sw_file=new CSocketFile(&ConnectedSocket);
sw_in=new CArchive(sw_file,CArchive::load);
if(sw_in->IsLoading)
{
sw_in->Flush();
*sw_in >> dwValue;///到这里我就不知道该怎么办了?
} //客户方发送来的是文件,
//我用CSocketFile,CAchive来接受,到了这部我不
} //该怎么办了,怎么把CAchive手机来的数据转为文件各位老大,帮我看看吧!!!给出解答立即给分!!!
void CAsyncSocket::OnBtnListen()
{
// TODO: Add extra validation here
ListenSocket.Create(9000);
ListenSocket.Listen();
}void CAsyncSocket::OnAccept()
{
ListenSocket.Accept(ConnectedSocket);
}void CAsyncSocket::OnReceive()
{
BYTE dwValue;
CSocketFile *sw_file;
CArchive *sw_in;
// CArchive* dwValue;
sw_file=new CSocketFile(&ConnectedSocket);
sw_in=new CArchive(sw_file,CArchive::load);
if(sw_in->IsLoading)
{
sw_in->Flush();
*sw_in >> dwValue;///到这里我就不知道该怎么办了?
} //客户方发送来的是文件,
//我用CSocketFile,CAchive来接受,到了这部我不
} //该怎么办了,怎么把CAchive手机来的数据转为文件各位老大,帮我看看吧!!!给出解答立即给分!!!
解决方案 »
- MFC用ODBC连接数据库,具体应该在程序的什么位置进行连接和关闭?
- CDC::SelectObject后,是否要DeleteObject?
- C++调试遇到了千年一遇的怪事!!
- 如何避免在每个窗口都要进行数据库的连接?????
- 如果我在VC下使用api来编写串口通信的程序,是不是不能基于对话框,那么界面如何实现?
- 有没有更好的方法限制一个CString内的字符为数值型的
- 在VC中使用QT遇到的问题?
- 请各位诊断,有关VARIANT!
- 我刚用vc7.0,怎么找不到classwizard?
- 急求答案 请问vb调用vc创建的dll时,为什么报错?请各位高手指点一下,代码如下:
- 大家尝试过加载JPG图片么?VC下好像只能用BMP图片,怎么办?
- !!!简单的问题呀!!抢份了哟!!怎样设置一个闪烁的输入光标呀?
typedef struct _SOCKET_STREAM_FILE_INFO { TCHAR szFileTitle[128]; //文件的标题名
DWORD dwFileAttributes; //文件的属性
FILETIME ftCreationTime; //文件的创建时间
FILETIME ftLastAccessTime; //文件的最后访问时间
FILETIME ftLastWriteTime; //文件的最后修改时间
DWORD nFileSizeHigh; //文件大小的高位双字
DWORD nFileSizeLow; //文件大小的低位双字
DWORD dwReserved0; //保留,为0
DWORD dwReserved1; //保留,为0} SOCKET_STREAM_FILE_INFO, * PSOCKET_STREAM_FILE_INFO;
void CFile_Transfer::OnDataReceive()
{
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
pStatus->SetFont(&pFrame->m_font,TRUE);
CSocket sockClient;
sockClient.Create();
sockClient.Bind(808,NULL);
CString szIP;
OnTransIP();
szIP=m_desIP;
sockClient.CancelBlockingCall();
int buf=10240;
sockClient.SetSockOpt(SO_SNDBUF,(char*)&buf,sizeof(int),SOL_SOCKET);
sockClient.SetSockOpt(SO_RCVBUF,(char*)&buf,sizeof(int),SOL_SOCKET);
int timeout=300;
int status=setsockopt(sockClient,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));
if(!sockClient.Connect((LPCTSTR)szIP, 800))
{
// Invalidate();
m_conFlag=FALSE;
pStatus->SetPaneText(1,"连接目标计算机失败");
return;
}
else{
pStatus->SetPaneText(0,"当前状态 :");
SOCKET_STREAM_FILE_INFO2 StreamFileInfo;
::Sleep(20);
sockClient.Receive(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO2));
////////////////////////////////////////////////////////
//PROGRESS
CProgressCtrl m_Progress;
RECT MyRect;
pStatus->GetItemRect(1, &MyRect);
m_Progress.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH, MyRect, pStatus, 1);
m_Progress.SetRange(0,(short)StreamFileInfo.nFileSizeLow);
m_Progress.SetPos(0);
m_Progress.SetStep(5);
////////////////////////////////////////////////////
CFile destFile(m_ProDir+StreamFileInfo.szFileTitle, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
UINT dwRead = 0;
while(dwRead<StreamFileInfo.nFileSizeLow)
{
byte* data = new byte[2048];
memset(data,0,2048);
UINT dw=sockClient.Receive(data, 2048);
destFile.Write(data, dw);
dwRead+=dw;
delete [] data;
m_Progress.StepIt();
}
m_Progress.SetPos((short)StreamFileInfo.nFileSizeLow);
m_Progress.DestroyWindow();
SetFileTime((HANDLE)destFile.m_hFile,&StreamFileInfo.ftCreationTime,
&StreamFileInfo.ftLastAccessTime,&StreamFileInfo.ftLastWriteTime);
SetFileAttributes(m_ProDir+StreamFileInfo.szFileTitle,StreamFileInfo.dwFileAttributes);
destFile.Close();
sockClient.ShutDown();
sockClient.Close();
}
}
1。在howtotell(touch)的代码中,
sockClient.Receive(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));
这句代码把接受的数据存到StreamFileInfo对象中,这就是说,在发送端肯定也有
一个
sockClient.Send(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));
而且在客户端肯定有一个对StreamFileInfo对象成员的附值,在传送过来以后。
服务器端即刻调用void MyFSocketet::OnReceive(int nErrorCode)函数进行接受。在这个函数中,若用到
sockClient.Receive(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));
在接受完这个类试于报头的的数据后,紧接着有调用了
UINT dw=sockClient.Receive(data, 2048);
????能在OnReceive()中连用两次吗??是不是发送方也得发送两次??
一次发文件信息,二次发文件本身。
但是,客户方的Send()来到时,触发的是服务器方的OnReceive事件,但一个事件总有两个Receive()且类型,内容不同,程序难道能自动的实现:
Send(&StreamFileInfo)时Receive(&StreamFileInfo)来接受;
Send(rFile)时Receive(&StreamFileInfo)来接受?????
各位高手在帮我解答一下吧!!!!!!!!