| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1157 人关注过本帖
标题:[求助]如何用WINSOCK控件拷贝局域网内其它计算机上的文件?
只看楼主 加入收藏
qlyk
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-9-11
收藏
 问题点数:0 回复次数:6 
[求助]如何用WINSOCK控件拷贝局域网内其它计算机上的文件?
例如
本机IP:192.168.0.09
本机名称:no99
已知目标计算机的IP:192.168.0.10
目标计算机名称:no100
我打算在我计算机直接拷贝对方C:\1.dbf到我的C盘下,而不需要对方确认或回应
反之把我计算机的文件D:\OK.dbf拷贝到对方的D:盘下也不需要对方确认,请问用WINSOCK控件需要怎么做?
如有时间请附代码,谢谢

搜索更多相关主题的帖子: 局域网 计算机 WINSOCK 控件 文件 
2006-10-23 11:01
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 

自己拟订代码命令

例如

发送字符串

COPY 路径,本机路径

然后服务端SPLIT一下 就行了


[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-10-23 11:37
qlyk
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-9-11
收藏
得分:0 
我已经实现了客户端和服务端的消息会话,现在我想传输一个。DBF文件(不是字符串),而且只在我一台机器操作,对方没有接收或服务程序,我试了多少次仍然不得其法,就是不成功。。。。

锦上添花不如雪中送炭!! (完全自学,有不当之处敬请指正)
2006-10-23 13:41
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 
只有一个WINSOCK控件吗?  这样能行吗??

[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-10-24 08:19
qlyk
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-9-11
收藏
得分:0 

我不知道,只是看书看到这个控件了,可书上没有详细的介绍,如果这个控件不行的话用什么可以实现呢,我手里的资料太少了没有相关的例题,请多帮忙


锦上添花不如雪中送炭!! (完全自学,有不当之处敬请指正)
2006-10-24 09:06
jmasm
Rank: 1
等 级:新手上路
威 望:1
帖 子:368
专家分:0
注 册:2006-9-24
收藏
得分:0 

VB中使用WinSock控件传送文件


收藏本页到: 新浪ViVi 365Key 天极网摘 和讯网摘 搜狐网摘 POCO网摘 博采中国 字体:小 大

中华网络安全联盟 作者:佚名 来源:不详 时间:2006-4-12

传送文件对于网络编程来说是基本的功能,比如远程控制软件。在编制一个软件时,我从网上下了很多传文件的程序,这些程序提供的传文件功能根本就不能用。传文本还可以,传二进制文件根本就不行。因此,作为一个基本的功能模块,有必要单独介绍一下。
首先,在VB中要传送字符串,你可以这样写:
Dim strData As String
strData = "Test"
Winsock1.SendData strData
但是如果你传送的二进制文件,你还能用String变量来存放吗?从理论上分析是不行的,我也做了实验,确实是不行的。文件虽然可以传,但是接受的文件和发送的不一样,原因可能是二进制文件里可以有任何"字符",但是不是所有的字符都可以放在String变量里。
除了String类型的变量,VB中其他类型的变量都只有几个字节长,难道一次只能发几个字节吗?那样岂不是要累死机器了!其实,情况没有那么悲观,我们完全可以使用数组来解决这个问题,就是使用byte数组。把要传送的文件都读到数组里,然后发送出去。程序如下:


FileName 为要传送的文件名,WinS为发送文件的WinSock控件。这是一个发送端的程序。
Public Sub SendFile(FileName As String, WinS As Winsock)
Dim FreeF As Integer '空闲的文件号
Dim LenFile As Long '文件的长度
Dim bytData() As Byte '存放数据的数组
FreeF = FreeFile '获得空闲的文件号
Open FileName For Binary As #FreeFile '打开文件
DoEvents

LenFile = LOF(FreeFile) '获得文件长度
ReDim bytData(1 To LenFile) '根据文件长度重新定义数组大小
Get #FreeFile, , bytData '把文件读入到数组里
Close #FreeFile '关闭文件
WinS.SendData bytData '发送数据
End Sub

接受端的程序如下:

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim bytData() As Byte
Dim f
f = FreeFile
Open strFileName For Binary As #f
ReDim bytData(1 To bytesTotal)
Winsock1.GetData bytData
Put #f, i, bytData
i = i + bytesTotal '保证每次写都是在文件的末尾, i是个全局变量
Close #f
End Sub

这里有两个需要注意的地方,ReDim Preserve bytData(1 To LenFile),下标是从1开始的,如果你写成ReDim bytData( LenFile),下标就是从0开始了,数组就有LenFile+1长了。LenFile = LOF(FreeFile)中的LOF是获得文件长度的函数,是VB里带的,我见过很多例子用API,或者循环的读直到末尾来获取文件长度,这样都是很麻烦的,使用LOF函数就可以了。
这样的程序,即可以传送文本文件,也可以传送二进制文件。但是你有没有发现这个程序的问题呢?如果我要传送一个50M的文件呢?系统可以为bytData分配50M的内存空间吗?
于是笔者拿一个50M的文件做实验吧,接收到的文件和原来的文件不一样,比原来的大。问题出在那呢?
首先,根据文件大小重新定义bytData数组的大小本身就有问题,系统是不可能无限制的给数组分配空间的,即使可以,也会造成系统响应变慢。在传50M文件的时候,系统就跟死机了一样。那么怎么解决这个问题呢,一个自然的想法就是把数据分段传送。程序如下:
发送程序, iPos是个全局变量,初始值为0。这个变量保存着当前数据的位置。Const iMax = 65535是每个数据块的大小。


Dim FreeF As Integer '空闲的文件号
Dim LenFile As Long '文件的长度
Dim bytData() As Byte '存放数据的数组
FreeF = FreeFile '获得空闲的文件号
Open FileName For Binary As #FreeF '打开文件
DoEvents
LenFile = LOF(FreeF) '获得文件长度
If LenFile <= iMax Then '如果要发送的文件小于数据块大小,直接发送
ReDim bytData(1 To LenFile) '根据文件长度重新定义数组大小
Get #FreeF, , bytData '把文件读入到数组里
Close #FreeF '关闭文件
WinS.SendData bytData '发送数据
Exit Sub
End If
'文件大于数据块大小,进行分块发送
Do Until (iPos >= (LenFile - iMax)) '发送整块数据的循环
ReDim bytData(1 To iMax)
Get #FreeF, iPos + 1, bytData
WinS.SendData bytData
iPos = iPos + iMax '移动iPos,使它指向下来要读的数据
Loop
'这里要注意的是,必须检查文件有没有剩下的数据,如果文件大小正好等于数据块大小的
' 整数倍,那么就没有剩下的数据了
ReDim bytData(1 To LenFile - iPos) '发送剩下的不够一个数据块的数据
Get #FreeF, iPos + 1, bytData
WinS.SendData bytData
Close #FreeF

下面是接收端的程序:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim bytData() As Byte
Dim lLenFile As Long
Dim f
f = FreeFile
Open strFileName For Binary As #f 'strFileName是文件名
lLenFile = LOF(f)
ReDim bytData(1 To bytesTotal)
Winsock1.GetData bytData
If lLenFile = 0 Then 'lLenFile=0表示是第一次打开文件,这里有个问题,就是'如果如果该文件存在的话,就会出错,应该在打开前检查文件是否存在。(这里我省略了)
Put #f, 1, bytData
Else
Put #f, lLenFile + 1, bytData
End If
Close #f
End Sub



我在网上找的

2006-10-25 13:40
syh878
Rank: 1
等 级:新手上路
威 望:2
帖 子:461
专家分:0
注 册:2005-9-2
收藏
得分:0 

注意一下传输的机制,不然就会丢包.


2006-10-25 16:36
快速回复:[求助]如何用WINSOCK控件拷贝局域网内其它计算机上的文件?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021052 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved