WINSOCK - ENVIO DE ARQUIVOS - PERDA DE PACOTE ?

MENINAPOWERUSER 26/05/2010 13:19:01
#342842
BOM O Q OCORRE é O SEGUNTE O PROGRAMA Q SITEI EM ALGUNS TOPICOS DE AJUDA ATRAS MANDA IMAGENS PEQUENAS ATE AI TUDO BEM AKI ESTOU NA PARTE DE TRANSFERENCIA DE ARQUIVOS , ASSIM SE EU MANDAR UM ARQUIVO MENOR Q 1 MB CHEGA NORMAL MAIOR Q ISSO CHEGA 800 KB EU USO A SEGUINTE ROTINA ...


CLIENTE ->
DIM ARQ AS STRING
Open [Ô]C:\TESTE.TXT[Ô] For Binary As #1
Me.ARQ = Input(LOF(1), 1)
Close #1
WINSOCK.SEND [Ô]TRANS|[Ô] & ARQ
[ô]ISSO MANDANDO

AGORA RECEBENDO

NO EVENTO DATAARRIVAL
DIM SEP AS STRING
DIM REB AS STRING
WINSOCK.GETDATA REB
SEP = SPLIT(REB,[Ô]|[Ô])
Open [Ô]D:\NOVO.txt[Ô] For Binary As #1
Put #1, 1,SEP(2)
[ô]fechamos o arquivo
Close #1

MAIS NAUM CHEGA O ARQUIVO INTEIRO , OUVI FALAR Q TEM COMO MANDAR
BYTE A BYTE MAIS EU NAUM CONSIGO ALGUEM TEM UM EXEMPLO COMENTADO
PASSO-A-PASSO DE COMO FAZER ! OBRIGADO
PAYDANA 26/05/2010 21:44:51
#342889
vi isso na net e lembrei do seu topico
derrepente..
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=59653&lngWId=1
MENINAPOWERUSER 31/05/2010 10:33:45
#343328
mais naum é bem isso
eu quero a logica de como abrir o arquivo em binario
em mandar de 10 em 10 bytes entendeu
MARCELO.TREZE 31/05/2010 10:55:50
#343337
minha amiga vc leu o tópico, ele diz extamente isto

vou explicar em portugues o que o tópico que o colega apresentou diz

primeiro vc determina a quantidade de bytes em que o arquivo será quebrado

Private Const chunk = 10 [ô]aqui antes quebrava a cada 8000 bytes mas como vc deseja 10 apenas 


[ô]Botão enviar
private sub send_click()

[ô]Pega o nome do arquivo
[ô]Função GetFileName usado para obter o nome do arquivo
dim fnamea as string
dim fname as string

if text1.text = [Ô][Ô] then
msgbox [Ô]Por favor, digite o nome do arquivo!!![Ô]
exit sub
end if
fname = text1.text
[ô]Checando se o arquivo existe
If Dir(fname) = [Ô][Ô] Then
MsgBox [Ô]O Arquivo não existe[Ô]
exit sub [ô]Sai da sub se não existir
end if

fnamea=GetFileName(text1.text)
fname=text2.text
dim temp as string
temp= [Ô]rqst[Ô] & fnamea

[ô]SEND

winsock1.senddata temp [ô]enviando arquivo pelo nome

end sub




agora o pedido é enviado para o cliente
em seguida, o servidor tem que esperar a resposta do cliente

Este evento é chamado quando os dados chegam ao winsock1

Private Sub winsock1_dataarrival(ByVal bytestotal As Long)
Dim response As String
Winsock1.GetData response, vbString
Select Case response
Case [Ô]okay[Ô]
send fname [ô]send function is called with file name as argument
Case [Ô]deny[Ô]
MsgBox [Ô]Your request to send the file [Ô] & fname & [Ô] has been denied[Ô], , [Ô]manjit[Ô] [ô]message when request is denied
End Select
End Sub


agora a função que realmente envia o arquivo


Private Sub send(fname As String)
Command2.Enabled = False
Command3.Enabled = False
Text1.Enabled = False

Dim data As String
Dim a As Long
Dim data1 As String
Dim data2 As String


Open fname For Binary As #1

Do While Not EOF(1)
data = Input(chunk, #1)
Winsock1.SendData data
DoEvents
Loop
Winsock1.SendData [Ô]EnDf[Ô]
Close #1
Command2.Enabled = True
Command3.Enabled = True
Text1.Enabled = True

End Sub



Esta é outra função de suporte

Function GetFileName(attach_str As String) As String
Dim s As Integer
Dim temp As String
s = InStr(1, attach_str, [Ô]\[Ô])
temp = attach_str
Do While s > 0
temp = Mid(temp, s + 1, Len(temp))
s = InStr(1, temp, [Ô]\[Ô])
Loop
GetFileName = temp
End Function


agora falta a parte do cliente
MARCELO.TREZE 31/05/2010 11:07:50
#343344
Bom agora a parte do cliente



conjunto winsock1 para ouvir uma determinada porta dizer: 165
winsoc2 e se você quiser bate-papo também: 166


winsock1 está escutando na porta 165 e Winsock2 está escutando na porta 166
no lado do cliente

Então, quando chega pedido de ligação

private sub winsock1_connectionrequest(byval idrequest as long)
if winsock1.state <> sckConnected then
winsock1.close
winsock1.accept idrequest
end if
end sub


e:

private sub winsock2_connectionrequest(byval idrequest as long)
if winsock2.state <> sckConnected then
winsock2.close
winsock2.accept idrequest
end if
end sub


Chegada de dados:

e quando chega dados

Private Sub winsock1_dataarrival(ByVal bytestotal As Long)

Dim data As String
Dim data4 As String
Dim data2 As String
Dim data3 As String
Dim data5 As String
Dim data6 As String

Winsock1.GetData data, vbString

data2 = Left(data, 4)
Select Case data2
Case [Ô]rqst[Ô] [ô]Solicitação de arquivo chega

data3 = Right(data, Len(data) - (4)) [ô]Pega o noe do arquivo

Dim msg1 As Integer
msg1 = MsgBox(Winsock1.RemoteHost & [Ô] Quer enviar o arquivo[Ô] & data3 & [Ô] aceitar? [Ô], vbYesNo, [Ô]envio de arquivo[Ô])


If msg1 = 6 Then [ô]
Winsock1.SendData [Ô]ok[Ô]
cd.FileName = data3
data5 = Split(data3, [Ô].[Ô])(1)
data6 = [Ô]*.[Ô] & data5
cd.DefaultExt = [Ô](data6)[Ô]
data4 = App.Path & [Ô]\[Ô] & data3
[ô]MsgBox data5
[ô]cd.ShowSave

Open data4 For Binary As #1

Else
Winsock1.SendData [Ô]deny[Ô]
Exit Sub
End If

Case [Ô]EnDf[Ô]
Label1.Caption = [Ô]Tamnho do arquivo recebido : [Ô] & sz & [Ô] Kb[Ô]
size=0
sz=o
Close #1
Case Else

size = size + 1
Label1.Caption = size * 8 & [Ô]Kb Recebidos[Ô]
sz = size * 8
Put #1, , data
End Select
End Sub


Isto irá cuidar de transferência de arquivo agora para o chat:
estaremos usando Winsock2 para bate-papo:

No lado do servidor:

Quando enviar é clicado

Private Sub Command1_Click()
Dim chat As String
chat = Text1.Text
List1.AddItem (chat)
Winsock2.SendData chat

End Sub


Quando os dados chegam

Private Sub winsock2_dataarrival(ByVal bytestotal As Long)
Dim cht As String
Winsock2.GetData cht, vbString
List1.AddItem (cht)

End Sub


e é isto
Tópico encerrado , respostas não são mais permitidas