发新话题 回复
分享主题 打印

通过特定指令和Exit Sub实现单Winsock多客户端文件传输

通过特定指令和Exit Sub实现单Winsock多客户端文件传输

我继续杯具。今天第六天
终于写完了。

今天实在太懒了,直接扔核心代码。这段代码通过期间的指令就可以完成单Winsock完善任何文件传输。配合那个Yanshi函数可以控制cpu和内存占用率了///惯例,优化版本不扔
完美排版请参见[y_10_s]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 编辑 ]
谁不怀念苏联,谁就没有良心;谁想回到苏联,谁就没有头脑.

Woodu.ME--从零开始的博客生活
TOP
发新话题 回复