Winsock 传送文件问题?

南山明月 2004-10-11 12:23:44
本人写了一个Winsock 传送文件的程序分服务器端和客户端,
服务器端用Winsock 数组分别接收客户端发的数据,请问当有多个客户端同时上传时服务器怎么同时接收
,并行处理我想了很多办法,但服务器端是一个一个的接收的我想多个客户同时上传时也同时接收!
...全文
407 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
weron 2004-10-12
  • 打赏
  • 举报
回复
其实最好能用ftp
然后地址通知给大家
呵呵省了很多麻烦
freedomjim 2004-10-12
  • 打赏
  • 举报
回复
下载用innet控件吧
南山明月 2004-10-12
  • 打赏
  • 举报
回复
to freedomjim(老头) 你的方法能讲一讲吗
zyg0 2004-10-11
  • 打赏
  • 举报
回复
用控件苏组完全可以解决,
socket的属性
Private Sub Winsock1_DataArrival(index As Integer, ByVal bytesTotal As Long)
也都是单独的,和并不并行没什么关系阿
horsefly 2004-10-11
  • 打赏
  • 举报
回复
一个就是用多线程处理,一个就是用消息队列处理。
我们以前的是用消息队列处理的,这适合用于数量不多,处理不是很复杂的那种,
否则就用多线程处理。一个客户端对应一个线程,每个线程处理各自的客户端发来的数据,以实现并行处理,以及解决并发的问题。
freedomjim 2004-10-11
  • 打赏
  • 举报
回复
呵呵,该方法简单明了
只可惜不能自己控制进度
哈哈
鱼和熊掌不可兼得
南山明月 2004-10-11
  • 打赏
  • 举报
回复
主要问题已经解决!谢谢大家,: freedomjim(老头) 所说:"数量大的问题,如果你同时有很多客户上传,
处理器本身都处理不过来,会出现缓冲区不够,就算你另外开线程也是没用的这就需要有很好的服务器
如果你同时上传的数据量不大,也就是服务器能支持的话多个上传是不会存在并发的问题的
每个winsock都自己会开通一个线程,并有其缓冲的,只有程序处理没问题,就可以了
不过这里强调,不要在接收的时候,使用公共变量"


我想大规模应用时这些问题会出现大家还有没有更好的意见当然有上传就有下载下载我不想用Winsock
,(有的上传有的下载) 我想这样服务器会处理不过来,(有的上传有的下载)
大家认为呢。!!!!!!!!!!

我想单简的用一个API
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

'
Public Function DownloadFile(URL As String, LocalFilename As String) As Boolean
Dim lngRetVal As Long
lngRetVal = URLDownloadToFile(0, URL, LocalFilename, 0, 0)
If lngRetVal = 0 Then DownloadFile = True
End Function

Private Sub Command1_Click()
DownloadFile "http://nic.ysu.edu.cn/jswd/jswd/images/xlogo.gif", "c:\aa.gif"

End Sub


windlin1314 2004-10-11
  • 打赏
  • 举报
回复
可否在internet上用?
stiffe01 2004-10-11
  • 打赏
  • 举报
回复
=================================================
HTTP://WWW.ITZYK.NET IT资源库--->IT人的专业资源库
=================================================
http://www.itzyk.net 中国IT人的技术资源网站。网站刚刚起步,希望广大IT网友们加入我们,我们会一直把这个网站做大,做全起来。现在网站分为两大部分:http://bbs.itzyk.net -->专业讨论DoNet技术的论坛社区 http://down.itzyk.net 各种程序源码的下载站。
现在论坛区正处于发展壮大期,诚邀各位有志于IT技术方面的朋友加入我们的论坛来负责版主一职,发挥你们的能力让我们把这个论坛壮大起来吧!

http://bbs.itzyk.net 欢迎您的到来!同时也欢迎各位IT朋友批评、指教!
boyzhang 2004-10-11
  • 打赏
  • 举报
回复
GZ
南山明月 2004-10-11
  • 打赏
  • 举报
回复
freedomjim(老头) 的话是解决问题的关键
zyg0 2004-10-11
  • 打赏
  • 举报
回复
我定义成叔祖主要是为了实现和sockets苏组索引的同步,好调用和付值
freedomjim 2004-10-11
  • 打赏
  • 举报
回复
主要是数量大的问题,如果你同时有很多客户上传,
处理器本身都处理不过来,会出现缓冲区不够,就算你另外开线程也是没用的
这就需要有很好的服务器

如果你同时上传的数据量不大,也就是服务器能支持的话
多个上传是不会存在并发的问题的
每个winsock都自己会开通一个线程,并有其缓冲的,只有程序处理没问题,就可以了
不过这里强调,不要在接收的时候,使用公共变量
南山明月 2004-10-11
  • 打赏
  • 举报
回复
Dim GotDat() As Byte 看来已要定义成一个类似数组的东西,弄成结构体得了
南山明月 2004-10-11
  • 打赏
  • 举报
回复
zyg0(影子(努力吃饭中)) ( ) 信誉:97 的办法好
zyg0 2004-10-11
  • 打赏
  • 举报
回复
Private Sub wsListen_DataArrival(Index As Integer, ByVal bytesTotal As Long)
--改这里
If Not GotHeader(index-1) Then
Dim Dat As String
wsListen(Index).GetData Dat$, vbString
ReDim Preserve ftRcv(0 To Index)

If Left(Dat$, 4) = "FILE" Then
Dim FirstPos As Long, SecondPos As Long
FirstPos = InStr(6, Dat, ":")
SecondPos = InStr(FirstPos + 1, Dat, ":")

With ftRcv(Index)
.FileName = Mid(Dat, 6, (FirstPos - 6))
.FileSize = CDbl(Mid(Dat, FirstPos + 1, (SecondPos - FirstPos) - 1))
'.Comment = Right(Dat, 200)
'.From = wsReceive.RemoteHostIP
'.frmRcOpt.Prepare MyID
.Destination = "E:\Receive\" & Mid(Dat, 6, (FirstPos - 6)) 'save the file to
wsListen(Index).SendData "ACCEPT"
GotHeader = True
End With
End If
Else
'**************************************
If FileNum = 0 Then
FileNum = FreeFile
On Error Resume Next
If FileLen(ftRcv(Index).Destination) > 0 Then Kill ftRcv(Index).Destination
Open ftRcv(Index).Destination For Binary As #FileNum
End If

Dim DepoT() As Long
Dim GotDat() As Byte

'Dim Hash As Stringhi,
ByteSec = ByteSec + bytesTotal
Receivedbyt = Receivedbyt + bytesTotal
ReDim GotDat(0 To bytesTotal - 1)
wsListen(Index).GetData GotDat, vbArray + vbByte
Put #FileNum, , GotDat

Label2.Caption = "有文件正在传送..."

If Receivedbyt = ftRcv(Index).FileSize Then
Close FileNum
Complete = True
wsListen(Index).Close
Label2.Caption = ""
End If
End If
End Sub
zyg0 2004-10-11
  • 打赏
  • 举报
回复
你的GotHeader 是1个bool类型的值吧,这样改,把它改成数组
dim GotHeader() as bool

Private Sub wsListen_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
intMax = intMax + 1
Load wsListen(intMax)
wsListen(intMax).LocalPort = 0
wsListen(intMax).Accept requestID
--这里加
redim Preserve GotHeader(intMax-2)

GotHeader(intMax-2)=false


End If

End Sub
南山明月 2004-10-11
  • 打赏
  • 举报
回复
只有horsefly() ( ) 信誉:105 老兄切中问题的实质,
freedomjim(老头) ( ) 信誉:100 老兄的程序我早已实现谢谢!。
zgvslch(烟花离落) ( ) 信誉:100 老兄的的长篇大论可以帮初学者!。
我要的是服务器端同时处理各客户端发来的大量数据,
Private Sub Form_Load()
wsListen(0).LocalPort = FT_USE_PORT
wsListen(0).Listen
End Sub

Private Sub wsListen_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
intMax = intMax + 1
Load wsListen(intMax)
wsListen(intMax).LocalPort = 0
wsListen(intMax).Accept requestID
End If
End Sub
Private Sub wsListen_DataArrival(Index As Integer, ByVal bytesTotal As Long)
If Not GotHeader Then
Dim Dat As String
wsListen(Index).GetData Dat$, vbString
ReDim Preserve ftRcv(0 To Index)

If Left(Dat$, 4) = "FILE" Then
Dim FirstPos As Long, SecondPos As Long
FirstPos = InStr(6, Dat, ":")
SecondPos = InStr(FirstPos + 1, Dat, ":")

With ftRcv(Index)
.FileName = Mid(Dat, 6, (FirstPos - 6))
.FileSize = CDbl(Mid(Dat, FirstPos + 1, (SecondPos - FirstPos) - 1))
'.Comment = Right(Dat, 200)
'.From = wsReceive.RemoteHostIP
'.frmRcOpt.Prepare MyID
.Destination = "E:\Receive\" & Mid(Dat, 6, (FirstPos - 6)) 'save the file to
wsListen(Index).SendData "ACCEPT"
GotHeader = True
End With
End If
Else
'**************************************
If FileNum = 0 Then
FileNum = FreeFile
On Error Resume Next
If FileLen(ftRcv(Index).Destination) > 0 Then Kill ftRcv(Index).Destination
Open ftRcv(Index).Destination For Binary As #FileNum
End If

Dim DepoT() As Long
Dim GotDat() As Byte

'Dim Hash As Stringhi,
ByteSec = ByteSec + bytesTotal
Receivedbyt = Receivedbyt + bytesTotal
ReDim GotDat(0 To bytesTotal - 1)
wsListen(Index).GetData GotDat, vbArray + vbByte
Put #FileNum, , GotDat

Label2.Caption = "有文件正在传送..."

If Receivedbyt = ftRcv(Index).FileSize Then
Close FileNum
Complete = True
wsListen(Index).Close
Label2.Caption = ""
End If
End If
End Sub
'我已写了一个理论上能传任意大小文件,
'分为服务端和客户端但是当有多个客户端同时
'上传时就有问题了不知道你们是如何处理并行上传的
这是主要的接收代码但不能同时处理多个客户并行上传

freedomjim 2004-10-11
  • 打赏
  • 举报
回复
需要程序,可以邮箱联系:freedomjim@163.com
可以点对点发文件,可以向多台机发文件
纯Winsock实现
zgvslch 2004-10-11
  • 打赏
  • 举报
回复
不好意思,有点长,但认真看也用不了多少时间。第一帖是双机,第二贴是多台计算机的。
加载更多回复(3)

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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