Сами напросились
'Используется multiwinsock ZClient/Server, но с обычным Winsock'ом такие же проблемы
'Пример входящей строки: OPENМатематика\01\1401.jpg
F28673
№кх{ћЇW№кх{ћЇW№кх{ћЇU ю5щысЈЕэфOТЋљт§¦ЋјзЙЮ№
'Case поставлен на Data
'Queue - текстовый массив из которго считывает таймер (в коде таймера стоит просто SendFile
Case "OPEN" 'открыть файл
If InStr(1, Data, "..") > 0 Then GoTo errH
printMonitor ("Client data arrival " & "/" & "ID: " & ClientID & "/" & "Name: " & userList(ClientID).Name & " (" & ZServer.ClientIP(ClientID) & ")") & "/" & Data
dStr = readFILE(uPath & Mid(Data, 5, InStr(1, Data, vbCrLf) - 5))
If FileLen(uPath & Mid(Data, 5, InStr(1, Data, vbCrLf) - 5)) <= 4096 Then
If QueuePeak > UBound(Queue) Then
ZServer.SendData ClientID, "MSGBСервер занят. Попрубуйте выполнить операцию еще раз"
Exit Sub
End If
Queue(QueuePeak).CLID = ClientID
Queue(QueuePeak).Data = Left(Data, InStr(1, Data, vbCrLf) - 1) & vbCrLf & "F1" & vbCrLf & dStr
QueuePeak = QueuePeak + 1
Else
M = CLng(Mid(Data, InStr(1, Data, vbCrLf) + 1))
If M + 4095 + 4096 < Len(dStr) Then
M = M + 4096
If QueuePeak > UBound(Queue) Then
ZServer.SendData ClientID, "MSGBСервер занят. Попрубуйте выполнить операцию еще раз"
Exit Sub
End If
Queue(QueuePeak).Data = Left(Data, InStr(1, Data, vbCrLf) - 1) & vbCrLf & ("P" & CStr(M)) & vbCrLf & Mid(dStr, M, 4096)
Queue(QueuePeak).CLID = ClientID
QueuePeak = QueuePeak + 1
Else
M = M + 4096
If QueuePeak > UBound(Queue) Then
ZServer.SendData ClientID, "MSGBСервер занят. Попрубуйте выполнить операцию еще раз"
Exit Sub
End If
Queue(QueuePeak).Data = Left(Data, InStr(1, Data, vbCrLf) - 1) & vbCrLf & ("F" & CStr(M)) & vbCrLf & Mid(dStr, M)
Queue(QueuePeak).CLID = ClientID
QueuePeak = QueuePeak + 1
End If
End If
Exit Sub
Function readFILE(tPath As String) As String
DoEvents
On Error GoTo errH
intfa = FreeFile
Close #intfa
Open tPath For Binary As intfa
readFILE = Space$(LOF(intfa))
Get #intfa, , readFILE
Close #intfa
Exit Function
errH:
printMonitor ("ERROR (" & Err.Description & ")" & " on data: " & Data)
Close #intfa
End Function
'Код клиента
Sub NetReceiveFile(Data As String)
On Error GoTo ErrH
Dim M As Long
Dim N As Long
Dim L As Byte
Dim eStr As String
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
If btnDownload.Visible = True Then Exit Sub '!!!
M = InStr(1, Data, vbCrLf)
eStr = Left(Data, M - 1) 'FILE
Data = Mid(Data, Len(eStr) + 3)
If Left(Data, 1) = "F" Then
L = 1
If ListDownload.ListCount > 0 Then ListDownload.RemoveItem 0
DoEvents
End If
Data = Mid(Data, 2)
M = InStr(1, Data, vbCrLf)
N = CLng(Left(Data, M - 1)) 'in what bytes write
Data = Mid(Data, M + 2)
'--------------------------
intFF = FreeFile
Open SourcePath & eStr For Binary As intFF
If L <> 1 Then ListDownload.List(0) = Left(ListDownload.List(0), InStrRev(ListDownload.List(0), ".") + 1) & " " & CStr(N + 4095) & " байт"
Put #intFF, N, Data
Close #intFF
'--------------------------
If L = 1 Then ' L=1 means that it is "F" - final section of file!
If ListDownload.ListCount = 0 Then btnStopDownload_Click
Sleep (1)
If btnStopDownload.Visible = True Then NewDownload
Else
Sleep (1)
ZClient.SendData ("OPEN" & eStr & vbCrLf & N)
End If
ErrH:
If Err.Number > 0 Then
MsgBox "Обращение к файлу " & SourcePath & eStr & vbCrLf & Err.Description, vbCritical, "Sun test"
btnStopDownload_Click
End If
End Sub