(高分诚征) 采用TCP/IP在两台电脑快速传输一个300KB大小的文件的代码 我现在需要这样一个功能,但是用了VB来写,我用Winsock控件,达不到要求,它一次只可以传输8KB的数据,但是采用多个send,又说什么块什么的,底层无法控制,我想应该用VC做了,各位给点代码吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 好啊,伊妹儿来了 [email protected] http://expert.csdn.net/Expert/topic/1257/1257670.xml?temp=.5817377 win98ddk(阿发,你在干嘛?上来!上来!!给我上来) :给你发了,收运到了码? to liangrq(大笨钟):哥们,给我也发一份吧:[email protected] to liangrq(大笨钟):哥们,给我也发一份吧:[email protected]:) 不用明天了,我看了,当场发现问题。代码采用的是阻塞的模式,假设sockSrvr.Listen()之后没有人连接上来,则会产生长时间的等待。还有,不能够支持多用户的连接 win98ddk, 你就不能改一下应用到你的程序中吗? 给你的程序是最简单的实现了文件的传输功能的了。 /*===============================文件传输====================================================== 功能:把指定的文件传输到指定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;} to:liangrq(大笨钟)我给你发了mail,请指教 如何实现计算器上科学型和标准型界面的切换?知道的请详细介绍具体步骤。 搞了一天,没搞明白的鼠标捕获问题!也没想出解决办法! 看《深入浅出MFC》的几个问题? 查找子字符串的函数? 如何让按钮透明,除了按钮中位图之外的区域透明显示窗体背景色????????? 抽奖系统 如何判断一个CString是否只由字母构成? 关于VC中改变cursor的问题,急! 请问如何通过vc访问某个url并将返回结果存入CString ? 怎么给分? . 谁有透明的静态文本框,或编辑框控件!!!!!!!!!!! 牵涉到template和friend的问题,帮忙看看!
哥们,给我也发一份吧:
[email protected]
哥们,给我也发一份吧:[email protected]:)
sockSrvr.Listen()
之后没有人连接上来,则会产生长时间的等待。
还有,不能够支持多用户的连接
你就不能改一下应用到你的程序中吗?
给你的程序是最简单的实现了文件的传输功能的了。
/*===============================文件传输======================================================
功能:把指定的文件传输到指定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;
}
我给你发了mail,请指教