Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: WinSock + передача файла Добавлено: 20.12.06 22:56  

Автор вопроса:  Elkatib
Народ, пожалуйста, приведите листинг кода, реализирующего пример того, как передать от клиента серверу файл, через ВинСок.
p.s. открываю файл в бинарном режиме, загружаю его всего в переменную и далее:
а) когда кладёшь эту переменную в новый файл, получается копия файла.
б) когда пытаюсь передать эту переменную через ВинСок серверу и уже через него создаю файл - ничерта не получается. Понятно, что ошибок до фига, но каких?

Заранее спасибо.

Ответить

  Ответы Всего ответов: 12  

Номер ответа: 1
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #1 Добавлено: 20.12.06 23:33
По такому описанию проблемы могу только указать на ошибки в ДНК

Ответить

Номер ответа: 2
Автор ответа:
 Elkatib



Вопросов: 18
Ответов: 25
 Профиль | | #2 Добавлено: 22.12.06 19:47
От души братан, молодец...
Клиент:

If ws.State = sckConnected Then
Dim x As Integer
Dim vBuf As String * 1000

Open "C:\1.exe" For Binary As #1
x = LOF(1)
MsgBox x
Do Until EOF(1)
    Get #1, , vBuf
    ws.SendData vBuf
    Pause_2sek
    MsgBox vBuf, , "Отправил"
Loop
Close #1


Сервак:
Private Sub ws_DataArrival(ByVal bytesTotal As Long)

Dim vData As String
Dim x As Integer
x = 0


ws.GetData vData
Open "C:\2.exe" For Binary As #1
x = LOF(1)
If x = 0 Then x = 1
Seek #1, x
Put #1, , vData
MsgBox vData, , "Принял"
Close #1


End Sub


Не знаю пробывал по-разному не получается... может кто подскажет код?

Ответить

Номер ответа: 3
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #3 Добавлено: 23.12.06 02:28
и не говори что нету на vbstreets.ru

Ответить

Номер ответа: 4
Автор ответа:
 Elkatib



Вопросов: 18
Ответов: 25
 Профиль | | #4 Добавлено: 23.12.06 11:49
Ну, есть и что? Больше половины кодов на vbstreets, vbrussian и даже на буржуйских сайтах битые. Есть и рабочие, но я не могу понять принцип их работы. Вот я и спрашиваю как написать этот код в откровенно дебильно лёгкой форме. Признаюсь для себя... ибо новичок и нихрена не понимаю.
Да, кстати, а как и когда применяется DoEvents?

Ответить

Номер ответа: 5
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #5 Добавлено: 23.12.06 17:47
Больше всего нелюблю когда некий новичек, который называет даже себя так, говорит что коды битые...

Примеров и статей по винсоку достаточно. Если я приведу готовый исходный код, он будет работать, но чтобы ты в нём разобрался "до последней косточки" мне придется написать тут целую статью и прокоментировать каждую строчку исходного кода. Не поленись пойщи примеры сам. Тебе подойдут примеры практически всего: прокси серверов, сетевых пейджеров, сетевых игр итп итд... если это в виде статье, всё будет достаточно хорошо прокомментировано.

DoEvents применяется при длительных операций, когда нужно помимо этой затянувшийся операции, ещё отработать другие события. Например при бесконечном цикле, форма "умрет", её нельзя будет потягать, ресайзить, в скоре такое приложение получит статус зависшего, к заголовку окна добавится ";(Не отвечает)", а после определенного времени такое приложение вовсе будет убито операционной системой. Если в этот бесконечный цикл вставить DoEvents (в любое место), то при выполнении этой команды, управление передастся событиям которые находятся в очереди, т.е. тот же ресайз, перемещение или перерисовка... в итоге приложение отвечает на сообщения, т.е. не считается зависшей... В эти события могут входить и свои личные, т.е. например событие которое будет "общаться с публикой" (например показывать прогресс % работы длительной операции)....

Ответить

Номер ответа: 6
Автор ответа:
 blinow



Вопросов: 0
Ответов: 5
 Профиль | | #6 Добавлено: 24.12.06 05:41
Код приводить не буду. Вот примерные правила отправки.
Лучше сначала отправить такой типа код FF на том конце ага пришла команда, счас пойдут данные файла (открываешь файл и тд и тп).
В начале отправляемого сообщения прилепи какой-нибудь код определенного размера, например 2 символа. И в конце тоже определенный код. Например DDДанные файлаEE, получая сообщение отрезаешь 2 символа спереди, анализируешь, к примеру DD это данные, ага, читаем данные, проверяем в конце EE ага, дошел весь пакет и данные будут еще, в ответ отсылаем например СС, что значит принял, жду следующего пакета, только по приеме СС снова отсылаешь следующую порцию данных , то же анализируешь и тд, по исчерпывании данных отправляешь например QQ, что значит усе данных больше ек.
Некоторые скажут, а нафига стока много букавок, зато надежно, уже сколько пользуюсь и ни чего не глючит. Можно там контрольную сумму отсылать или еще как контролировать, ошибки пересылать и тд и тп.

Ответить

Номер ответа: 7
Автор ответа:
 blinow



Вопросов: 0
Ответов: 5
 Профиль | | #7 Добавлено: 24.12.06 05:58
А ты открывешь бинарник и читаешь в строку, ты смотрел, что у тебя там получается в той строке и затем пишешь строку в бинарник, там может оказаться очень странные данные и пересылать следует только символьные данные, а винарные кодировать в вид /045, те по кодам а при приеме назад переделывать в бинарник и сохранять, короче все очень мудро получается.

Ответить

Номер ответа: 8
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #8 Добавлено: 24.12.06 15:41
В начале отправляемого сообщения прилепи какой-нибудь код определенного размера, например 2 символа. И в конце тоже определенный код. Например DDДанные файлаEE, получая сообщение отрезаешь 2 символа спереди, анализируешь, к примеру DD это данные, ага, читаем данные, проверяем в конце EE ага, дошел весь пакет и данные будут еще, в ответ отсылаем например СС
Неверно. по двум причинам:
1. В самих ДАННЫХ ФАЙЛА может содержаться твои "EE", "CC" и пр.
2. Гораздо лучше и быстрей в начале отослать строку типа "Get file. Length: 406254<<". И потом просто отсылаешь этот файл. Как его длина(406254) будет передана считай что все окей =)

Ответить

Номер ответа: 9
Автор ответа:
 Elkatib



Вопросов: 18
Ответов: 25
 Профиль | | #9 Добавлено: 25.12.06 16:44
Ну, вот например вроде как рабочий код... кое как достал.
Как говорят не поленился, хотя реально нихрена не мог найти.
Передача:

Public Sub SendData(sFile As String, sSaveAs As String, tcpCtl As Winsock)
On Error GoTo ErrHandler
    Dim sSend As String, sBuf As String
    Dim ifreefile As Integer
    Dim lRead As Long, lLen As Long, lThisRead As Long, lLastRead As Long
    
    ifreefile = FreeFile
    
    ' Open file for binary access:
    Open sFile For Binary Access Read As #ifreefile
    lLen = LOF(ifreefile)
    
    ' Loop through the file, loading it up in chunks of 64k:
    Do While lRead < lLen
        lThisRead = 65536
        If lThisRead + lRead > lLen Then
            lThisRead = lLen - lRead
        End If
        If Not lThisRead = lLastRead Then
            sBuf = Space$(lThisRead)
        End If
        Get #ifreefile, , sBuf
        lRead = lRead + lThisRead
        [B]sSend = sSend & sBuf[/B]
    Loop
    lTotal = lLen
    Close ifreefile
    bSendingFile = True
    '// Send the file notification
    tcpCtl.SendData "FILE" & sSaveAs
    DoEvents
    '// Send the file
    [B]tcpCtl.SendData sSend[/B]
    DoEvents
    '// Finished
    tcpCtl.SendData "FILEEND"
    bSendingFile = False
    Exit Sub
ErrHandler:
    MsgBox "Err " & Err & " : " & Error
End Sub


Я понять не могу строку sSend = sSend & sBuf - это означает что файл считывается по 64 кб в переменную sSend и РАЗОМ отправляется в сеть???
А строка tcpCtl.SendData sSend означает что Public Sub SendData исполняется только один раз??? Да и почему перед ней указан DoEvents зачем передавать управление событиям "находящимся в очереди", да и собственно каким событиям? Объясните, пожалуйста, принцип действия кода???
Заранее спасибо большое.

Приём:

Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)
    Dim strData As String
    Dim ifreefile
    
    DoEvents
    tcpClient.GetData strData
    If Right$(strData, 7) = "FILEEND" Then
        bFileArriving = False
        lblProgress = "Saving File to " & App.Path & "\" & sFile
        sArriving = sArriving & Left$(strData, Len(strData) - 7)
        ifreefile = FreeFile
        If Dir(sFile) <> "" Then
            MsgBox "File Already Exists"
        Else
            Open sFile For Binary Access Write As #ifreefile
            [B]Put #ifreefile, 1, sArriving[/B]
            Close #ifreefile
            ShellExecute 0, vbNullString, App.Path & "\" & sFile, vbNullString, vbNullString, vbNormalFocus
        End If
        lblProgress = "Complete"
    ElseIf Left$(strData, 4) = "FILE" Then
        bFileArriving = True
        sFile = Right$(strData, Len(strData) - 4)
    ElseIf bFileArriving Then
        lblProgress = "Receiving " & bytesTotal & " bytes for " & sFile & " from " & tcpClient.RemoteHostIP
        [B]sArriving = sArriving & strData[/B]
    End If
End Sub



А здесь соответственно все куски файла из переменной sSend (ВинСок её поделил, так?) принимаются в sArriving, которая по окончании передачи записывается в sFile???

Ответить

Номер ответа: 10
Автор ответа:
 blinow



Вопросов: 0
Ответов: 5
 Профиль | | #10 Добавлено: 27.12.06 18:17
В начале отправляемого сообщения прилепи какой-нибудь код определенного размера, например 2 символа. И в конце тоже определенный код. Например DDДанные файлаEE, получая сообщение отрезаешь 2 символа спереди, анализируешь, к примеру DD это данные, ага, читаем данные, проверяем в конце EE ага, дошел весь пакет и данные будут еще, в ответ отсылаем например СС
Неверно. по двум причинам:
1. В самих ДАННЫХ ФАЙЛА может содержаться твои "EE", "CC" и пр.
2. Гораздо лучше и быстрей в начале отослать строку типа "Get file. Length: 406254<<". И потом просто отсылаешь этот файл. Как его длина(406254) будет передана считай что все окей =)

Дак если всегда прилепляешь то и всегда отлепляешь, главное размер этих кодов и все.

Ответить

Номер ответа: 11
Автор ответа:
 NEON



ICQ: 391274479 

Вопросов: 1
Ответов: 1
 Web-сайт: www.vb-all.narod.ru
 Профиль | | #11
Добавлено: 27.12.06 21:17
Зайди сюда есть исходники для чайников :)
www.vbmike.narod.ru/soft.htm

Ответить

Номер ответа: 12
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #12 Добавлено: 29.12.06 16:28
ВинСок её поделил, так?)

Так.

Дак если всегда прилепляешь то и всегда отлепляешь, главное размер этих кодов и все.
Прально.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам