我想写一个文件传输的类,多线程,支持断点续传。
我不知道该用CSocket 还是 CAyncSocket 还使用API?
还有就是对多用户的管理,没有一点概念,这两天都在考虑这个问题,很晕!
谢谢
我不知道该用CSocket 还是 CAyncSocket 还使用API?
还有就是对多用户的管理,没有一点概念,这两天都在考虑这个问题,很晕!
谢谢
解决方案 »
- 如何实现记录下连到本机上面的所有的IP和端口?
- VC 的基本对话框,如何实现随鼠标移动窗口也移动
- 计数器控制图片的到入
- 怎么得到窗口的位置?在WM_MOVING消息中 怎么得到 窗口的位置
- 进程问题
- 请问如何实现多个文本内容(文字)对比,然后输出每两个文本相同的内容。
- 我在VC中的SDI或者MDI中使用工具条,可我不知道他是在那个类的那个函数中创建的
- 一个在树控件使用checkbox 的问题
- 关于鼠标钩子
- C++ MFC ActiveMovie控件控制面板怎么去掉
- 请教CListCtrl控件中加入图标列的做法?
- 请问:程序中添加一个托盘后,如何获取该托盘图标的位置,不是通过获取鼠标的位置那种情况
这里有问必答
http://systemer.51.net/cgi-bin/leoboard.cgi
希望你能在这里找到你满意的答案!
这篇文章不错,还有源代码
可是我现在要用MFC来开发,所以就不知道如果管理多个用户了
我也研究过NDK,可是觉得它的代码太麻烦了
{
CFile f;
BOOL p=f.Open(fname,CFile::modeRead);
char buff[1024];
int y;
int x;
if(!p)
return false;
while(true)
{
y=f.Read(buff,1024);
x=send(s,buff,y,0);
if(y<1024)
{
f.Close();
break;
}
} return true;
}www.codeproject.com/
/*===============================文件传输======================================================
功能:把指定的文件传输到指定IP地址的计算机。
参数:strIP : 目的计算机的IP地址。
uPort : 端口号。
chSrc : 文件路径及名称。
bSend : 文件不存在时是否建立一个新文件。
返回值:
=============================================================================================*/
BOOL CopyFileClient(CString strIP, UINT uPort, char *chSrc, BOOL bSend)
{
BOOL bRet = FALSE;
CSocket sckClient;
CFile file;
do
{
if(bSend)
{
bRet = file.Open(chSrc, CFile::modeRead);
}
else
{
bRet = file.Open(chSrc, CFile::modeCreate | CFile::modeWrite);
}
if(!bRet)
{
break ;
}
bRet = sckClient.Create();
if(!bRet)
{
break ;
}
bRet = sckClient.Connect(strIP, uPort);
if(!bRet)
{
break ;
}
BYTE *chFileData = new BYTE[ 1024 + 1 ];
char chData[10];
int nSize = 0;
if(bSend)
{
nSize = file.GetLength();
int nRead = nSize;
ZeroMemory(chData, 10);
memcpy(chData, &nSize, sizeof(int));
int nRet = sckClient.Send(chData, sizeof(int));
if(nRet <= 0)
{
bRet = FALSE;
break ;
}
while(nRead > 0)
{
int n1 = min(nRead, 1024);
int n2 = file.Read(chFileData, n1);
nRead -= n2;
nRet = sckClient.Send(chFileData, n2);
if(nRet <= 0)
{
bRet = FALSE;
break ;
}
bRet = TRUE;
}
}
else
{
char chData[10];
ZeroMemory(chData, 10);
nSize = 0;
int nRet = sckClient.Receive(chData, 10);//读文件大小
if(nRet <= 0)
{
bRet = FALSE;
break ;
}
nSize = *((int*)(chData));
if(nSize <= 0)
{
bRet = FALSE;
break ;
}
BYTE *chFileData = new BYTE[1024+1];
int nWrite = 0;
while(nWrite < nSize)
{
nRet = sckClient.Receive(chFileData, 1024);
if(nRet <= 0)
{
bRet = FALSE;
break ;
}
file.Write(chFileData, nRet);
nWrite += nRet;
bRet = TRUE;
}
}
delete []chFileData;
if(!bRet) // 送文件数据出错.
{
break ;
}
}while(0);
if(sckClient.m_hSocket != INVALID_SOCKET)
{
sckClient.Close();
}
if(file.m_hFile != CFile::hFileNull)
{
file.Close();
} return bRet;
}
/*===============================文件接收======================================================
功能:把接收的数据保存到指定的文件中。
参数:uPort : 端口号。
chSrc : 文件路径及名称。
bSend : 文件不存在时是否建立一个新文件。
返回值:
=============================================================================================*/BOOL CopyFileServer(UINT uPort, char *chDes, BOOL bSend)
{
BOOL bRet = FALSE;
CFile file;
CSocket sckServer;
CSocket sckClient;
do
{
if(!bSend)
{
bRet = file.Open(chDes, CFile::modeCreate | CFile::modeWrite);
}
else
{
bRet = file.Open(chDes, CFile::modeRead);
}
if(!bRet)
{
break ;
}
bRet = sckServer.Create(uPort);
if(!bRet)
{
break ;
}
bRet = sckServer.Listen();
if(!bRet)
{
break ;
}
bRet = sckServer.Accept(sckClient);
if(!bRet)
{
break ;
}
char chData[10];
BYTE *chFileData = new BYTE[1024+1];
int nSize = 0;
if(!bSend)
{
ZeroMemory(chData, 10);
int nRet = sckClient.Receive(chData, 10);//读文件大小
if(nRet <= 0)
{
bRet = FALSE;
break ;
}
nSize = *((int*)(chData));
if(nSize <= 0)
{
bRet = FALSE;
break ;
}
int nWrite = 0;
while(nWrite < nSize)
{
nRet = sckClient.Receive(chFileData, 1024);
if(nRet <= 0)
{
bRet = FALSE;
break ;
}
file.Write(chFileData, nRet);
nWrite += nRet;
bRet = TRUE;
}
}
else
{
nSize = file.GetLength();
int nRead = nSize;
ZeroMemory(chData, 10);
memcpy(chData, &nSize, sizeof(int));
int nRet = sckClient.Send(chData, sizeof(int));
if(nRet <= 0)
{
bRet = FALSE;
break ;
}
while(nRead > 0)
{
int n1 = min(nRead, 1024);
int n2 = file.Read(chFileData, n1);
nRead -= n2;
nRet = sckClient.Send(chFileData, n2);
if(nRet <= 0)
{
bRet = FALSE;
break ;
}
bRet = TRUE;
}
}
delete []chFileData;
}while(0);
if(sckClient.m_hSocket != INVALID_SOCKET)
{
sckClient.Close();
}
if(sckServer.m_hSocket != INVALID_SOCKET)
{
sckServer.Close();
}
if(file.m_hFile != CFile::hFileNull)
{
file.Close();
} return bRet;
}