楼主
大 中
小 发表于 2010-2-22 00:52 只看该作者
通过特定指令和Exit Sub实现单Winsock多客户端文件传输
我继续杯具。今天第六天
终于写完了。
今天实在太懒了,直接扔核心代码。这段代码通过期间的指令就可以完成单Winsock完善任何文件传输。配合那个Yanshi函数可以控制cpu和内存占用率了///惯例,优化版本不扔
完美排版请参见 : http://poketb.com/woodu/2010/02/22/738-exit-sub-through-specific-instruction-and-single-winsock-multi-client-file-transfer/
001 Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
002 Rem 提示
003 'Type recivefile
004 ' startrecive As Boolean
005 ' startfilename As Boolean
006 ' FileName As String
007 ' startfiledata As Boolean
008 ' endl As Boolean
009 'End Type
010 'Type strrec
011 ' startstr As Boolean
012 ' str As String
013 'End Type
014 'Private file() As recivefile
015 'Private str() As strrec
016 Rem 前提是不是0,凡是传输到0的一概抛弃掉
017 If Index <> 0 Then
018 ReDim tempdata(bytesTotal)
019 Sock(Index).GetData tempdata()
020 Dim tempstr As String
021 tempstr = CStr(tempdata())
022 If Len(CStr(tempdata())) * 2 < 512 Then
023 Dim tmpx As Long
024 tempstr = ""
025 For tmpx = 0 To UBound(tempdata)
026 tempstr = tempstr & Chr(tempdata(tmpx))
027 Next
028 End If
029 Rem 第一个字符串是个什么玩意?
030 Select Case tempstr
031 Case "String":
032 Rem 字符串处理入口
033 str(Index).startstr = True
034 Exit Sub
035 Rem 字符串第一阶段结束
036 Case "Data":
037 Rem 文件接收入口
038 file(Index).startrecive = True
039 Exit Sub
040 Case "FileName":
041 Rem 文件名接收入口
042 file(Index).startfilename = True
043 Exit Sub
044 Case "StartFile":
045 Rem 文件数据
046 file(Index).startfiledata = True
047 Exit Sub
048 Case "EOFFile":
049 file(Index).startfiledata = False
050 'Close Index
051 Close Index
052 Exit Sub
053 Rem 文件接收第一阶段结束
054 ''''''''''''''''''''''''''''''''''''''''''
055 '''''''''''''''''警报!!'''''''''''''''''
056 ''''''''Rem 设置传输构思中ing~''''''''''''
057 '''''''''''''''''警报!!'''''''''''''''''
058 ''''''''''''''''''''''''''''''''''''''''''
059 Case "Config":
060 ''''''''''''''''''''''''''''''''''''''''''
061 '''''''''''''''''警报!!'''''''''''''''''
062 ''''''''Rem 设置传输构思中ing~''''''''''''
063 '''''''''''''''''警报!!'''''''''''''''''
064 ''''''''''''''''''''''''''''''''''''''''''
065 Rem 第二阶段入口
066 Case Else:
067 If str(Index).startstr Then
068 str(Index).str = tempdata()
069 Rem 字符串接收入口,写入到文件中,其中,目录名称会在保存中出现
070 Open "C:\aaa\" & Index & ".txt" For Append As Index
071 Print #1, str(Index).str
072 Close Index
073 txtLog = txtLog & vbCrLf & "收到新的消息。由" & Index & "号终端发送。已经保存在" & "C:\aaa\" & Index & ".txt。"
074 str(Index).startstr = False
075 Rem 关闭接收符号
076
077 Rem 字符串接收结束
078 Else
079 If file(Index).startrecive Then
080 Rem 文件接收入口
081 If file(Index).startfilename Then
082
083 tempstr = ""
084 For tmpx = 0 To UBound(tempdata)
085 tempstr = tempstr & Chr(tempdata(tmpx))
086 Next
087 file(Index).FileName = CStr(tempstr)
088 file(Index).FileName = Base64Decode(file(Index).FileName)
089 Rem 文件名接口结束
090 Open "C:\aaa\" & file(Index).FileName & ".file" For Binary Access Write As Index
091 file(Index).startfilename = False
092 Exit Sub
093 Else
094 If file(Index).startfiledata Then
095 Put Index, , tempdata()
096 End If
097 End If
098 End If
099 End If
100 End Select
101 End If
102 End Sub
[ 本帖最后由 最美我中文 于 2010-2-22 01:19 编辑 ]
|