Toon posts:

[.net] PPC Winsock

Pagina: 1
Acties:
  • 102 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik ben bezig met de client software voor mijn ppc en wil in VB.net een progje schrijven die files/data kan ontvangen nu is het maken van een desktop tooltje die data stuurt niet zo heel moeilijk alleen het ontvangen blijkt voor mij een groter probleem tezijn...

Ik wil een connectie maken dmv winsock alleen kan ik die niet toevoegen bij een smartdevicapplication in VS 2003 nu heb ik gelezen dat het wel met eVB kan maar is dat de enigste moelijkheid of kan ik mijn appje afproggen in VB .net met het compacte framework ?

Verwijderd

Topicstarter
Zie hier mijn probleem.
Afbeeldingslocatie: http://www.creative-designs.nl/gfx/vbdotnetwinsocks.jpg

[ Voor 78% gewijzigd door Verwijderd op 15-04-2005 14:01 ]


  • Lukse
  • Registratie: Januari 2004
  • Laatst online: 12-04-2023
Je kan ook met System.Net.Sockets werken.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Ik zou geen WinSock control gebruiken, .NET ondersteunt Sockets prima. Zelf op het compact framework.

Ook zijn er een hoop voorbeelden te vinden. De Socket class kun je zelf Asynchroon gebruiken.

Verwijderd

Topicstarter
questa schreef op vrijdag 15 april 2005 @ 16:53:
Ik zou geen WinSock control gebruiken, .NET ondersteunt Sockets prima. Zelf op het compact framework.

Ook zijn er een hoop voorbeelden te vinden. De Socket class kun je zelf Asynchroon gebruiken.
Ik ben begonnen met het uitproberen van de sockets...
Maar mijn progje blijft hangen zodra hij gaat luisteren op de port.
Ben nog aan het denken en proberen maar als iemand mij alvast kan helpen... graag ...

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        Try
            Dim bericht As String
            Dim port As Int32 = 8000
            Dim localAddr As IPAddress = IPAddress.Parse("10.10.0.2")
            Dim tcpListener As New TcpListener(localAddr, port)

            tcpListener.Start()

            Dim tcpClient As TcpClient = tcpListener.AcceptTcpClient()
            TextBox1.Text = "Bezig met Luisteren op port 8000"
            Dim reader As StreamReader = New StreamReader(tcpClient.GetStream)
            bericht = reader.ReadLine
            TextBox2.Text = bericht

        Catch ex As Exception
            TextBox1.Text = "Error"
        End Try

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Execute je deze code in je MainThread?

De method AcceptTcpClient returned pas als er daarwerkelijk een TCP connectie is opgezet, dus als er 30minuten lang niets connect naar port 8000 dan duur het 30 minuten voordat de AcceptTcpClient method returned.

Gooi dit in een anderen Thread en het probleem is opgelost.

Verwijderd

Topicstarter
questa schreef op maandag 18 april 2005 @ 11:20:
Execute je deze code in je MainThread?

De method AcceptTcpClient returned pas als er daarwerkelijk een TCP connectie is opgezet, dus als er 30minuten lang niets connect naar port 8000 dan duur het 30 minuten voordat de AcceptTcpClient method returned.

Gooi dit in een anderen Thread en het probleem is opgelost.
ik begrijp niet helemaal hoe je het bedoeld met de verschillende Threads zou je dat misschie iets duidelijker kunnen uitleggen ?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 07-05 10:04
Je kunt ongetwijfeld een asynchrone listener maken waarbij je alleen Accept nadat je em polt oid. Dan heb je geen threads nodig.

Misschien moet je ff de docs erbij pakken.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Je kunt het inderdaad ook Asynchrone doe, Socket.BeginAccept. Hiernaar zou je kunnen kijken. Maar ik zou dit zeker niet op je MainThread doen maar iig wel een apparte Thread starten. Kijk anders is naar de Thread class en lees is wat over MultiThreading. Dit is een must als je gaat werken met Sockets.

Verwijderd

Topicstarter
questa schreef op maandag 18 april 2005 @ 13:20:
Je kunt het inderdaad ook Asynchrone doe, Socket.BeginAccept. Hiernaar zou je kunnen kijken. Maar ik zou dit zeker niet op je MainThread doen maar iig wel een apparte Thread starten. Kijk anders is naar de Thread class en lees is wat over MultiThreading. Dit is een must als je gaat werken met Sockets.
Nu ben ik de laatste dagen lekker bezig geweest en dat heeft geresulteerd in het volgende :

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Imports System.Net.Sockets
Imports System.Threading

Sub Form_Load(Sender as Object, E as EventArgs) Handles MyBase.Load
Dim t as new Thread(AddressOf StartListen)
t.start
End Sub

Sub StartListen()
 Dim clientData As String = ""

        Do
            clientData = ""
            Try
                Dim TcpClient As New TcpClient()
                Dim TcpListener As New TcpListener(port)

                TcpListener.Start()
                TcpClient = TcpListener.AcceptTcpClient()

                Dim [bytestream](TcpClient.ReceiveBufferSize) As Byte
                Dim networkStream As NetworkStream = TcpClient.GetStream()

                networkStream.Read(bytestream, 0, TcpClient.ReceiveBufferSize)
                Dim output As String = Encoding.ASCII.GetString(bytestream)
                
       
                 TcpClient.Close()
                 TcpListener.Stop()
                Catch ex as exception
                End Try
           Loop
End Sub



client :
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
       Try
            connector.Connect("10.10.0.2", "8000")
            TextBox1.Text = "Connected"
            Dim networkStream As NetworkStream = connector.GetStream()
            Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("test1")
            networkStream.Write(sendBytes, 0, sendBytes.Length)
            Label1.Text = "Commando Verzonden"

            networkStream.Close()
            connector.Close()

        Catch ex As Exception
            Label1.Text = "Error Nier Verzonden"
        End Try


Het probleem is nu dat ik maar 1x iets kan verzenden, erna niet meer.
Als ik mijn client proggje opnieuw opstart dan kan ik wel iets versturen ik vermoed dus dat het probleem bij de client ligt.
iemand een idee ?

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Hoezo kun je maar 1 keer wat verzenden, krijg je een Exception als je het voor de tweede keer probeert of ontvang je gewoon niets meer?

Je kunt hoeft overigens niet telkens te stoppen en te starten.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub StartListen() 
 Dim clientData As String = "" 

        TcpListener.Start() 

        Try

           Do 
               clientData = "" 
               Try 
                   
                     ....
                
                End Try 
           Loop 

        End Try
        Finally
           TcpListener.Stop() 
        End Finally
End Sub

Verwijderd

Topicstarter
questa schreef op donderdag 21 april 2005 @ 11:59:
Hoezo kun je maar 1 keer wat verzenden, krijg je een Exception als je het voor de tweede keer probeert of ontvang je gewoon niets meer?

Je kunt hoeft overigens niet telkens te stoppen en te starten.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub StartListen() 
 Dim clientData As String = "" 

        TcpListener.Start() 

        Try

           Do 
               clientData = "" 
               Try 
                   
                     ....
                
                End Try 
           Loop 

        End Try
        Finally
           TcpListener.Stop() 
        End Finally
End Sub
Ontvangen kan hij wel alleen versturen lukt niet..
Ik moet dan de client opnieuw opstarten en dan kan ik weer iets versturen,.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Maar wat lukt er niet, krijg je een exception of ontvang je gewoon niets?

Verwijderd

Topicstarter
questa schreef op donderdag 21 april 2005 @ 15:03:
Maar wat lukt er niet, krijg je een exception of ontvang je gewoon niets?
ex.Message

System.net.socket.TcpClient

Dat krijg ik als ik iets voor de tweede keer probeer te versturen... :?

[ Voor 13% gewijzigd door Verwijderd op 21-04-2005 15:17 ]


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Die snap ik niet, je krijgt dus een exception neem ik aan. Wat is de stacktrace van die Exception en wat is ze message?

Kijk ook naar de InnerException is die leeg, zo nee, wat zegt die.

Verwijderd

Topicstarter
Krijg idd een exception

ex.meddage = System.net.socket.TcpClient

ex.StackTrace krijg ik error (Not a member of system.exception)

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Bij welke statement breakt hij dan?

Als je hetvolgde in je catch zet:

C#:
1
2
3
4
catch(Exception caught)
{
     System.Diagnostics.Debug.WriteLine(caught.ToString());
}


Wat voor output krijg je dan te zien?

Verwijderd

Topicstarter
questa schreef op donderdag 21 april 2005 @ 15:41:
Bij welke statement breakt hij dan?

Als je hetvolgde in je catch zet:

C#:
1
2
3
4
catch(Exception caught)
{
     System.Diagnostics.Debug.WriteLine(caught.ToString());
}


Wat voor output krijg je dan te zien?
Sorry prog in vb .net , C# lijkt er wel op maar blijft deels lastig voor mij.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Try
            connector.Connect("10.10.0.2", "8000")
            TextBox1.Text = "Connected"

            Dim networkStream As NetworkStream = connector.GetStream()
            Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("chassis power off")
            networkStream.Write(sendBytes, 0, sendBytes.Length)
            Label1.Text = "Commando Verzonden, Power Off"

            networkStream.Close()
            connector.Close()

        Catch ex As Exception

            TextBox2.Text = ex.Message


        End Try
    End Sub


Als ik voor de tweede keer op de button klik dan krijd ik ex.message

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Die is ipv TextBox2.Text = ex.Message is TextBox2.Text = ex.ToString()

Je moet ook even nagaan welke regel de Exception veroorzaakt.

Verwijderd

Topicstarter
questa schreef op donderdag 21 april 2005 @ 15:58:
Die is ipv TextBox2.Text = ex.Message is TextBox2.Text = ex.ToString()

Je moet ook even nagaan welke regel de Exception veroorzaakt.
Dan krijg ik na twee keer klikken op mijn button :

System.ObjectDisposedException:System.Net.Socket.TcpClient

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Na het aanroepen van .Close is je TcpClient gedispoced. Dus zul je hem opnieuw moeten aanmaken. Dus opniew connector= new TcpClient(...), altans ik ga ervanuit dan je connector de TcpClient is.

Verwijderd

Topicstarter
questa schreef op donderdag 21 april 2005 @ 16:13:
Na het aanroepen van .Close is je TcpClient gedispoced. Dus zul je hem opnieuw moeten aanmaken. Dus opniew connector= new TcpClient(...), altans ik ga ervanuit dan je connector de TcpClient is.
Dat was idd het probleem... dankjewel voor de goede hulp !! _/-\o_

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Nog even een tip.

Handel je connected client op de server ook in een apparte Thread af. Als er namelijk een Exception op treed nu, stop ook gelijk je hele server of als het ontvangen en behandelen van de connected client nu heel lang duur Accept je server voor een lange tijd geen connecties.

Verwijderd

Topicstarter
questa schreef op vrijdag 22 april 2005 @ 09:24:
Nog even een tip.

Handel je connected client op de server ook in een apparte Thread af. Als er namelijk een Exception op treed nu, stop ook gelijk je hele server of als het ontvangen en behandelen van de connected client nu heel lang duur Accept je server voor een lange tijd geen connecties.
Bedankt ik zal dat doen...

Nu heb ik alleen een laatste vraag, ik wil het zelfde stukje code gebruiken om data te ontvangen op mijn pda (compact framework) alleen kan ik hem niet compilen ik krijg dan de error :

Argument not specified for parameter 'index' of 'Public Overridable Function GetString(bytes() As Byte, index As Integer, count As Integer) As String'.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    Sub StartListen()
        Dim clientData As String = ""
        Do
            clientData = ""
            Try
                tcpListener.Start()
                TcpClient = tcpListener.AcceptTcpClient()

                Dim [bytestream](TcpClient.ReceiveBufferSize) As Byte
                Dim networkStream As NetworkStream = TcpClient.GetStream()

                networkStream.Read(bytestream, 0, TcpClient.ReceiveBufferSize)
                Dim output As String
                output = Encoding.ASCII.GetString(bytestream)   <--- deze regel
                output = Trim(output)
                Label2.Text = "Messgae" + output
                tcpListener.Stop()
            Catch ex As Exception
            End Try
        Loop
    End Sub

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Probeer is:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    Sub StartListen() 
        Dim clientData As String = "" 
        Do 
            clientData = "" 
            Try 
                tcpListener.Start() 
                TcpClient = tcpListener.AcceptTcpClient() 

                Dim [bytestream](TcpClient.ReceiveBufferSize) As Byte 
                Dim networkStream As NetworkStream = TcpClient.GetStream() 

                Dim bytesReceived As Int
                bytesReceived = networkStream.Read(bytestream, 0, TcpClient.ReceiveBufferSize) 
                Dim output As String 
                output = Encoding.ASCII.GetString(bytestream, 0, bytesReceived)   <--- deze regel 
                output = Trim(output) 
                Label2.Text = "Messgae" + output 
                tcpListener.Stop() 
            Catch ex As Exception 
            End Try 
        Loop 
    End Sub


Uit me hoofd getypt dus zou niet weten of de syntax correct is, want ik ben geen VB.NET devvert. Maar volgens mij zou het zo moeten werken.

Verwijderd

Topicstarter
En het werkt wederom ook !!
dankje !

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Dan ben ik wederom gelukkig :+
Pagina: 1