передать файл через winsock

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

передать файл через winsock

Сообщение Sasha_karasov » 29.03.2005 (Вт) 7:59

Я мне нужно передать файл через winsock, но у меня медленно копирует файлы.
Может поможете мне разобраться почему медленно копирует. Смотрел исходники подобные тотже алгоритм но копирует намного быстрей. Кстати по форуму искал не нашел.

Вот код может сразу и скажите:
Ниже множите скачать.
CLIENT:
‘IP – TextBox
‘Port - TextBox
‘Command1 – это connect
‘Command2 - SendFile
‘Text2 – пут к файлу
‘WS – Winsock
--------вот код клиента -----------------------
Dim PaketWait As Boolean
Dim t As String
Dim i As Long
Dim OK As Boolean
Private Sub Command2_Click()
Send_File
End Sub

Private Sub Form_Load()
PaketWait = False
IP.Text = ws.LocalIP
End Sub
Private Sub Command1_Click()
ws.Close
ws.RemoteHost = IP
ws.RemotePort = Port
ws.Connect
End Sub



Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim Data As String
ws.GetData Data
If Data = "+OK" Then OK = True
End Sub

Private Sub ws_SendComplete()
PaketWait = True
End Sub



Public Function Send_File() As Boolean
Send_File = False
Dim s As String
Dim l
Dim SF As String
l = FileLen(Text2.Text)
PaketWait = False
ws.SendData "FINFO" & l
Do While PaketWait = False
DoEvents
Loop
PaketWait = False
Open Text2.Text For Binary As #1
s = String(2048, vbNullChar)
Dim tmp As String
Do Until EOF(1)
DoEvents ' Даже если это убрать тоже долго и висит пока не скопирует
PaketWait = False

Get #1, , s
ws.SendData s



Loop
Close #1
Send_File = True
End Function
-----------------------end client---------------------

SEVER

Command2 – Сохранит файл
Text2 – Куда сохранить
P – ProgressBar

-------------А вот код-----------------------------
Dim File As String
Dim FS
Dim FSize
Private Sub Command2_Click()
Open Text1.Text For Output As #1
Print #1, File
Close #1
File = ""
End Sub
Private Sub Form_Load()
Me.Show
WS.Close
WS.LocalPort = 100
WS.Listen
End Sub
Private Sub Form_Unload(Cancel As Integer)
End
End Sub
Private Sub ws_ConnectionRequest(ByVal requestID As Long)
WS.Close
WS.Accept requestID ' à çà÷åì ýòî ?
End Sub
Private Sub ws_DataArrival(ByVal bytesTotal As Long)

Dim Data As String
WS.GetData Data
If Mid(Data, 1, 5) = "FINFO" Then
FSize = Int(Mid(Data, 6, Len(Data)))
P.Max = FSize
Exit Sub
End If
FS = FS + Len(Data)

If FS >= FSize Then
P.Value = P.Max
MsgBox "FILE +OK"
Exit Sub
Else
P.Value = FS
End If

File = File + Data
End Sub

------------------все --------------------

Только не надо говорит что у меня всегда пакеты по 2048 байт, даже если надо отослать <2048 байт, я зная, просто я это потом сделаю.
Вложения
C&S.zip
(3.87 Кб) Скачиваний: 56
Удачи!
С уважением, Алексадр.

Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Сообщение Jenizix » 29.03.2005 (Вт) 12:24

Используй тег [code] для выделения кода!!!!!!!!!!!!!
А может у тебя циклы зацикливаются???


{ тебе не надоело одинаковые топики создавать???}
Ушел в себя, вернусь не скоро...

Если вам нужно сделать прозрачной только форму, а контролы на ней нет, то вам сюда!!!

Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Сообщение Jenizix » 29.03.2005 (Вт) 13:37

Ну тк пускай поковыряет разные примеры и ищет у себя ошибки!!!
а то вааще забросит этот васик нахрен...

Ты думаеш ему на С++ легче будет???
Ушел в себя, вернусь не скоро...

Если вам нужно сделать прозрачной только форму, а контролы на ней нет, то вам сюда!!!

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 29.03.2005 (Вт) 18:47

Я топик тот кинул так как там не кто не отвечает, а другие исходники смотрел тоже алгоритм, но копирует быстрей, я уже 4 дня изучаю исходники но не могу найти причину почему у меня такие тормоза. FleX_2004 прав иногда можно столько время просидеть над ошибкой. А если убрать из кода DoEvents то быстрей но все-таки скорость не та (медленно копирует ), и весит SERVER.

Код: Выделить всё
Public Function Send_File() As Boolean
Send_File = False
Dim s As String
Dim l
Dim SF As String
l = FileLen(Text2.Text)
PaketWait = False
ws.SendData "FINFO" & l
Do While PaketWait = False
DoEvents
Loop
PaketWait = False
Open Text2.Text For Binary As #1
    s = String(2048, vbNullChar)
    Dim tmp As String
    Do Until EOF(1)
        'DoEvents ' если это убрать то  копирует быстрей но висит эSERVER, но все ровно скорость медленная.   
        PaketWait = False
       
        Get #1, , s
        ws.SendData s
       
       
       
    Loop
Close #1
Send_File = True
End Function
Удачи!
С уважением, Алексадр.

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 29.03.2005 (Вт) 19:19

А ты попробуй на одной и той же машине запустить и клиент и сервер.
Возможно тормоза идут из-за сети.

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 29.03.2005 (Вт) 20:19

Я и так на одной машине пробывал.
Последний раз редактировалось Sasha_karasov 08.06.2005 (Ср) 2:21, всего редактировалось 1 раз.
Удачи!
С уважением, Алексадр.

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 29.03.2005 (Вт) 21:33

Возможно проблема с МТU.(значение максимальной величины пакетов TCP/IP )
То есть если у тебя пакеты меньшие (а так оно и есть, потому что по умолчанию MTU=1500), то твои 2048 уходят не одним пакетом а двумя, причем 2 полупустой. Не надо дробить файл на 1500 потому что 1500 это размер пакета, а в него инкапсулируется и служебная информация.


И лично от себя. Я бы избавился от текстовой переменной. Возьми лучше байтовый массив- избавишься от ненужного действия String(2048, vbNullChar) и наверное с первой строкой Send_File = False надо тоже что-то делать.

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 29.03.2005 (Вт) 22:47

Inferno пробивал пакеты по 1500 также :cry: . Ниже есть исходник, тоже для передачи файлов через Winsock. Там тоже такие функции как и у меня но результат разный :cry: . Я на знаю в чем дела, помогите….
Удачи!
С уважением, Алексадр.

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 29.03.2005 (Вт) 22:48

Вот он:
Вложения
WinsockTrans.rar
(9.83 Кб) Скачиваний: 93
Удачи!
С уважением, Алексадр.

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 29.03.2005 (Вт) 23:54

http://www.vb.kiev.ua/code/networks/Full_Winsock_wrapper.zip
Посмотри ссылку. Довольно интересная реализация. Найдешь там 2 готовых класса для клиента и сервера. Зделано все на айпи.
Мне понравилось.

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 30.03.2005 (Ср) 7:43

Да мне надо через Winsock. Пожалуйста помогите, мне очень нужно.
Удачи!
С уважением, Алексадр.

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 30.03.2005 (Ср) 9:25

Ты хотя бы код открыл и посмотрел что к чему. Там винсок реализован через айпи, а не через оcx и что? Хотя дело конечо твое.

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 30.03.2005 (Ср) 16:35

У меня есть пример и без winapi. Скорость такаете.
Удачи!
С уважением, Алексадр.

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Сообщение xenomorph » 31.03.2005 (Чт) 9:45

Извини но у тебя весь код кривой 8).

Не используй петли. и DoEvents.
Только события.

Вот пример. Расчехляйся.
Вложения
RAC Network Transfer.rar
(83.18 Кб) Скачиваний: 108
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 31.03.2005 (Чт) 13:58

Sasha_karasov, Баг в твоей проге виден сразу! Он в стрчке:
File = File + Data

Нельзя так большой файл собирать. При каждом выполнении этого кода он переаллокэйчивает строку. Чем она больше тем это дольше! Пиши сразу в файл, или сразу размер строки под весь файл зарезервируй, а потом впихивай в неё данные с помошью mid$.
Программисты не глючат - глючат компиляторы...

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 01.04.2005 (Пт) 2:06

Спасибо, CodeName33.
Я тут Разобрался уже.
A я то думою, чем больше времени проходит тем меньше скорость.
Вот исходник можете глянуть.

А вот еще вопрос о Winsock, точнее о сети.
И через inet тоже можно работать с winsock, если моему другу поставить сервер, а себе клиент, в клиенте написать его ip (что показывает winsock у друга) и нажат connect, будет работать ?
Просто у меня сомнение:
Хватает ли IP адресов для всех. Например у меня IP: 192.168.1.1 больно красивый для маленького города.
[/url][/b]
Удачи!
С уважением, Алексадр.

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 01.04.2005 (Пт) 2:08

Спасибо, CodeName33.
Я тут Разобрался уже.
A я то думою, чем больше времени проходит тем меньше скорость.
Вот исходник можете глянуть.

А вот еще вопрос о Winsock, точнее о сети.
И через inet тоже можно работать с winsock, если моему другу поставить сервер, а себе клиент, в клиенте написать его ip (что показывает winsock у друга) и нажат connect, будет работать ?
Просто у меня сомнение:
Хватает ли IP адресов для всех. Например у меня IP: 192.168.1.1 больно красивый для маленького города.
[/url][/b]
Вложения
sendfile.zip
Доделанный исходник.
(3.45 Кб) Скачиваний: 83
Удачи!
С уважением, Алексадр.

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 01.04.2005 (Пт) 3:13

По внутренней сети будет. Адресов пока хватает, но это пока :)
У тебя не реальный айпи, а выделенный из группы предназначеной для внутреннего использования. Таких групп 3.
192.168.X.X
10.X.X.X
Третью не помню :)

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 01.04.2005 (Пт) 5:39

А как ко мне подключится?
Удачи!
С уважением, Алексадр.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.04.2005 (Пт) 7:28

NAT
Lasciate ogni speranza, voi ch'entrate.

Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Сообщение Jenizix » 03.04.2005 (Вс) 14:47

Вот!!! Решил написать свою передавалку файлов по винсоку!!! Вот результаты:
Передавал фильм... с одного HDD на другой

Запись из журнала файрвола:
ft_server.exe TCP 127.0.0.1 1122 0:01:17 7.7 Мб/с 6 байтов 592.7 Мб
ft_client.exe TCP 127.0.0.1 31337 0:01:18 7.7 Мб/с 592.7 Мб 6 байтов

решил потестить другие проги написанные на VB:

первая: 24.1Mb - 00:01:07 - Overflow
вторая: 60Mb - 00:04:43 - Run Time Error =))

ЗЫ. Я свою прогу писал на С++ и на чистом АПИ...
А какие на ваших прогах результаты?
Ушел в себя, вернусь не скоро...

Если вам нужно сделать прозрачной только форму, а контролы на ней нет, то вам сюда!!!

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 03.04.2005 (Вс) 16:08

Свой проверил, копировал фильм (655 МБ) 5 минут и 10 секунд.
А на VB.NET можно такой результат получить, как на C++?
Не а все-таки как ко мне подключится?, если у меня ip(192.168.1.6) на настоящий?
Удачи!
С уважением, Алексадр.


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 90

    TopList  
cron