社区
网络编程
帖子详情
(高分诚征) 采用TCP/IP在两台电脑快速传输一个300KB大小的文件的代码
win98ddk
2002-12-05 04:34:45
我现在需要这样一个功能,但是用了VB来写,我用Winsock控件,达不到要求,它一次只可以传输8KB的数据,但是采用多个send,又说什么块什么的,底层无法控制,我想应该用VC做了,各位给点代码吧
...全文
58
12
打赏
收藏
(高分诚征) 采用TCP/IP在两台电脑快速传输一个300KB大小的文件的代码
我现在需要这样一个功能,但是用了VB来写,我用Winsock控件,达不到要求,它一次只可以传输8KB的数据,但是采用多个send,又说什么块什么的,底层无法控制,我想应该用VC做了,各位给点代码吧
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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,给你发。
《ACM竞赛-C/C++入门》 C语言-13
清华大学尹成老师、微软全球具有价值专家,手把手从基础教学到深入探讨,教你成为信息学竞赛高手,让你知识点一通百通拿到竞赛
高分
,为编程开发打下坚实的基础! 从零基础到在蓝桥杯、NO
IP
、ACM竞赛、信息学...
前端面试js+es6
js基本数据类型 值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。 注:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二...
TCP
/
IP
是
一个
四层
如何实现1080P延迟低于500ms的实时超清直播
传输
技术
本文是去年我发布在高可用架构公众号的文章,在此做一次转载...最近由于公司业务关系,需要
一个
在公网上能实时互动超清视频的架构和技术方案。众所周知,视频直播用CDN + RTMP就可以满足绝大部分视频直播业务,我们也接
操作系统课后题答案二
基本数据项描述
一个
对象某种属性的字符集,具有数据名、数据类型及数据值三个特性。组合数据项由若干数据项构成。 ②记录是一组相关数据项的集合,用于描述
一个
对象某方面的属性。 ③
文件
是具有
文件
名的一组相关...
计算机网络基础试卷4,计算机网络基础试题库4
《计算机网络基础》卷4一、单项选择题1、在常用的
传输
介质中,带宽最大、信号
传输
衰减最小、抗干扰能力最强的一类
传输
介质是( )A.双绞线 B.光纤 C.同轴电缆 D.无线信道2、在脉冲编码调制(PCM)方法中,如果规定的量化...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章