(高分诚征) 采用TCP/IP在两台电脑快速传输一个300KB大小的文件的代码

win98ddk 2002-12-05 04:34:45
我现在需要这样一个功能,但是用了VB来写,我用Winsock控件,达不到要求,它一次只可以传输8KB的数据,但是采用多个send,又说什么块什么的,底层无法控制,我想应该用VC做了,各位给点代码吧
...全文
58 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
braversmmu 2002-12-16
  • 打赏
  • 举报
回复
to:liangrq(大笨钟)
我给你发了mail,请指教
bb123456789 2002-12-16
  • 打赏
  • 举报
回复

/*===============================文件传输======================================================
功能:把指定的文件传输到指定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;
}

liangrq 2002-12-15
  • 打赏
  • 举报
回复
win98ddk,
你就不能改一下应用到你的程序中吗?
给你的程序是最简单的实现了文件的传输功能的了。
win98ddk 2002-12-15
  • 打赏
  • 举报
回复
不用明天了,我看了,当场发现问题。代码采用的是阻塞的模式,假设
sockSrvr.Listen()
之后没有人连接上来,则会产生长时间的等待。
还有,不能够支持多用户的连接
win98ddk 2002-12-15
  • 打赏
  • 举报
回复
收到,我看看先~~,明天给答复
liangrq 2002-12-15
  • 打赏
  • 举报
回复
发了,希望对你有帮助。
waitingforyou 2002-12-15
  • 打赏
  • 举报
回复
to liangrq(大笨钟):
哥们,给我也发一份吧:

xiexl@gwnet.com.cn

THX-:)
braversmmu 2002-12-15
  • 打赏
  • 举报
回复
to liangrq(大笨钟):
哥们,给我也发一份吧:
bravernudt2000@vip.sina.com
liangrq 2002-12-14
  • 打赏
  • 举报
回复
win98ddk(阿发,你在干嘛?上来!上来!!给我上来) :

给你发了,收运到了码?
HongHuer 2002-12-14
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/1257/1257670.xml?temp=.5817377
win98ddk 2002-12-06
  • 打赏
  • 举报
回复
好啊,伊妹儿来了 mingyangsoft@163.com
liangrq 2002-12-05
  • 打赏
  • 举报
回复
留下email,给你发。

18,356

社区成员

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

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