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 Кб) Скачиваний: 55
Удачи!
С уважением, Алексадр.