Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Korištenje socketa i downloadanje - uploadanje fajlova? Vb.net

[es] :: .NET :: .NET Desktop razvoj :: Korištenje socketa i downloadanje - uploadanje fajlova? Vb.net

[ Pregleda: 1659 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Omega Warrior
Zoran Bogdanov
Croatia

Član broj: 68126
Poruke: 43
*.adsl.net.t-com.hr.



Profil

icon Korištenje socketa i downloadanje - uploadanje fajlova? Vb.net23.01.2008. u 08:42 - pre 197 meseci
Pozdrav,

Imam problema sa socketima u VB.NET-u. Ovako:

Radim projekt na kojem imam 2 aplikacije, jedna se izvodi na kompjuteru(WinXP,2k) a druga se izvodi na ručnom terminalu (WIN CE). Moja pitanja će biti uz kod:


Glavni dio za primanje na WIN CE djelu:
Code:

  If listener.Pending Then
            Application.DoEvents()
            RaiseEvent status("Pending OK")
            Application.DoEvents()

            Try
                Dim socket As Socket = listener.AcceptSocket
                RaiseEvent status("SOCKET prihvacen")
                Dim rBuffer(socket.Available) As Byte               ' U velikom frameworku, ima jedno svojstvo (receivedBufferSize) u ovom Compact frameworku tog svojstva nema, pa ja nemogu otkrit veličinu buffera, ideje?
                Do
                    socket.Receive(rBuffer)                              'Za ovaj dio treba dinamički mijenjat veličinu polja (redim preserve) ali kod većih fajlova to je extremno sporo, ima koji bolji način?
                Loop While socket.Available > 0

                RaiseEvent status("Velicina fajla :" & rBuffer.Length)
                Application.DoEvents()
                spremiFile(rBuffer) ' U ovoj funkciju uzimam cijeli array bytova i spremam u neki fajl
                uspjeh = True

            Catch ex As Exception
                Application.DoEvents()
                RaiseEvent status("ERR:" & ex.Message)
                Application.DoEvents()
                abort = True
            End Try
        End If



Dio za slanje fajlova (WinXP, cijeli framework) :
   Dim tcp As New TcpClient
        Dim repeatCounter As Integer
        Dim i As Integer

        For i = 0 To repeatCounter

            Try
                tcp.Connect(ipAdresa, port.ToString)

                Dim nStream As NetworkStream = tcp.GetStream

                If nStream.CanWrite Then
                    nStream.Write(data, 0, data.Length)                         ' Data su podatci koje šaljem... znam da i tu ima bolji na koji se to slanje izvodi... Ideje
                Else
                    RaiseEvent greskaPriDownloadu("Greška pri downloadu")
                    tcp.Close()
                End If
                tcp.Close()
                Return True
            Catch ex As System.Net.Sockets.SocketException
                repeatCounter += 1                                                     ' Ako se ne uspije spojit trebalo bi 3 puta ponavljat, ali na ovj način neradi. (jer kad se ne uspije spojit on izaci socket exception i kaže da ciljni uređaj nije odgovorio u tih nekoliko sekundi...
 
            Catch ex As Exception
                errHandler(ex)
                tcp.Close()
                Return False
            End Try
            If repeatCounter = 2 Then Return False
        Next
    End Function



U biti treba mi neki bolji način za primanje fajlova i slanje, jel ovo je i sporo i nesigurno...

Bilo kakve ideje, sugestije dobrodošle.

Hvala!!

[Shadowed: dodati code tagovi.]

[Ovu poruku je menjao Shadowed dana 23.01.2008. u 10:35 GMT+1]
 
Odgovor na temu

Predrag Glumac
Luxembourg

Član broj: 167588
Poruke: 127
*.eunet.yu.



Profil

icon Re: Korištenje socketa i downloadanje - uploadanje fajlova? Vb.net23.01.2008. u 10:07 - pre 197 meseci
Citat:
Dim rBuffer(socket.Available) As Byte ' U velikom frameworku, ima jedno svojstvo (receivedBufferSize) u ovom Compact frameworku tog svojstva nema, pa ja nemogu otkrit veličinu buffera, ideje?


Mislim da to nema veze sa CF-om koliko sa WinCE koji koristi socket 1.1 (ako se nevaram), ali probaj preko GetSocketOpt metode.

Citat:
socket.Receive(rBuffer) 'Za ovaj dio treba dinamički mijenjat veličinu polja (redim preserve) ali kod većih fajlova to je extremno sporo, ima koji bolji način?


Generalno - nemoj da alociras bafer za celu velicinu fajla, nego u fajl upisuj kako ti stigne paket, deo po deo. Ti alociraj bafer od recimo 256 bajtova i citaj preko Receive metode, koja ti vraca koliko si bajtova zapravo procitao iz bafera socketa.

Citat:
nStream.Write(data, 0, data.Length) ' Data su podatci koje šaljem... znam da i tu ima bolji na koji se to slanje izvodi... Ideje


Nema ako hoces da koristis TcpClient. Alternativno mozes asinhrono sa BeginSend ili BeginSendFile preko socketa (TcpClient.Client).

Citat:
repeatCounter += 1 ' Ako se ne uspije spojit trebalo bi 3 puta ponavljat, ali na ovj način neradi. (jer kad se ne uspije spojit on izaci socket exception i kaže da ciljni uređaj nije odgovorio u tih nekoliko sekundi...


Izbaci ovaj brojac i inkrementiranje, a stavi samo for i as integer =0 to 3, jer ako uspe konekcija i slanje, ti izlazis iz metode (return true), u protivnom for petlja radi jos jednu iteraciju. I na kraju, ispod next stavi return false.
Mada bih ja razdvojio try-catch blokove za konektovanje i slanje.
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: Korištenje socketa i downloadanje - uploadanje fajlova? Vb.net

[ Pregleda: 1659 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.