Передача файлов ч/з модем

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ArgoruS
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 23.01.2002 (Ср) 17:36
Откуда: Russia

Передача файлов ч/з модем

Сообщение ArgoruS » 19.11.2004 (Пт) 21:20

Написал на днях программку. Передает файлы по сети (TCP/IP,Winsock.ocx). Но тут возникла проблема: при передачи по LAN файлы приходят в целости и сохранности, а вот по модему - в файлах некоторые строки заменяются на какую-то абракадабру (причем размер файла такой же как и на передающем сервере). В чем может быть причина этого bug'a?

Ответ "в кривух ручках" не принимается :-)

Сама программа действует по принципу последовательной передачи файла по частям (1024 байт): Клиент запрашивает часть файла -> сервер побайтово читает этот файл и передает клиенту эту часть.

Могу выложить код, но там попутно обрабатывается еще до кучи информации и поэтому его будет сложно понять.

P.S.
Может у кого есть ссылка на готовый ActiveX с поддержкой множественных подключений и передачей файла?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.11.2004 (Пт) 22:38

Просто Winsock_DataArrival покажи, и мы всё поймём :-)
Изображение

ArgoruS
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 23.01.2002 (Ср) 17:36
Откуда: Russia

Сообщение ArgoruS » 20.11.2004 (Сб) 9:40

Сами напросились :-)

'Используется 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

ArgoruS
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 23.01.2002 (Ср) 17:36
Откуда: Russia

Сообщение ArgoruS » 20.11.2004 (Сб) 9:43

Кстати, просмотрел Debug и уаидел что иногда вместо отправляемой с сервера строки до клиента доходит нечто другое :shock:
Причем по LAN все впорядке. Может sleep надо ставить больше???

ArgoruS
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 23.01.2002 (Ср) 17:36
Откуда: Russia

Сообщение ArgoruS » 20.11.2004 (Сб) 17:03

Блин, ну хоть кто нибудь ответьте!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: PetalBot и гости: 17

    TopList