Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[VB 2008] Program na socketach .net.socket lub winsock

alien1983 24 Dec 2009 20:38 1513 0
  • #1
    alien1983
    Level 13  
    Witam
    Mam pewnien problem z socketami mianowicie, winsock (winsock.dll) działa mi na zwykłym pc prawidłowo dzięki funkcji DataArival - po odebraniu całego pakietu danych ponawia prosbe o nowe dane i je pobiera tak szybko jak to możliwe ()

    Natomiast mi bardziej zależy na programowaniu palmtopów pod windows mobile i ta kontrolka nie działa mi prawidłowo pod tymi urządzeniami tzn. nie idzie skompilować kodu przeniesionego z normalnego programu dla zwyklego pc. Wiec zrobiłem komunikacje na .net.sockets że tak powiem jest wiecej zachodu z tym. Ogólnie programik działa ale jest jeden poważny problem nie mam w nim funkcji DataArival
    i kod działa na Timer . Program prawidłowo czyta dane jesli opóznienia timera są w okolicach 100 ms dla bardzo dobrego sygnału WIFI oraz w okolicach 1 s dla słabego sygnału wifi . Przy bardzo słabym sygnale (wolnej komunikacji) program się sypie.

    Program do zwykłego pc napisany na winsock działa prawidłowo przy jakimkolwiek sygnale wifi (zakładamy że sygnal jest na tyle mocny że się nie zrywa z połączenia z systemem windows) . No i program ten czytał dane z serwera tak szybko jak się dało przy słabym sygnale stawal lub predkość odczytu spadała do 1/s przy bardzo dobrym sygnale dochodziła do 100 / s (wartosc teoretyczna napewno grubo poniżej 100ms)

    Prosiłbym o odpowiedz czy jest gdzies biblioteka winsock dla systemu windows mobile ?

    Lub czy dało by się poprawić poniższy kod dla windows mobile / .net.socket
    Program działa przy niskiej czestotliwosci odczytu dla słabego sygnału , i wysokiej dla dobrego sygnału choc czasami mogą się zdarzyć błędy w odczycie z bufora.

    Potrzebowałbym wstawić w pętli if warunek jeżeli do bufora trafi cały pakiet wtedy wykonuj dalszą część programu

    Problem w tym że nie wiem jak zbadać moment trafienia całego pakietu do bufora.

    oto kod:

    Code:
    Public Class Form1
    
        Dim tcpClient As New System.Net.Sockets.TcpClient()

        Dim connect As Boolean = False
        Dim p As Integer = 0
        Dim s As String = 0
        'Dim returndata As String = "111"
        Dim returndata2 As String = ""
        'Dim n As Boolean = False
        Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Me.Close()
        End Sub


        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            tcpClient.Connect("192.168.1.254", 55555)
        End Sub

        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            If connect = False Then
                Dim networkStream As NetworkStream = tcpClient.GetStream()
                Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("1")
                NetworkStream.Write(sendBytes, 0, sendBytes.Length)
                returndata2 = ""
                Timer1.Enabled = True
                connect = True
                Button3.Text = ("Connect")
            Else
                Timer1.Enabled = False
                connect = False
                'TcpClient.Close()
                Button3.Text = ("DisConnect")
            End If

        End Sub

        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Timer1.Enabled = False
            Dim networkStream As NetworkStream = tcpClient.GetStream()
            If networkStream.CanWrite And networkStream.CanRead Then
                ' Do a simple write.
                'Dim bytes(tcpClient.ReceiveBufferSize) As Byte
                'Read the NetworkStream into a byte buffer.
                'Dim bytes(tcpClient.ReceiveBufferSize) As Byte




                'networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))
                'Dim returndata As String = Encoding.ASCII.GetString(bytes, 0, CInt(tcpClient.ReceiveBufferSize))
                'returndata = returndata.Trim
                ' Output the data received from the host to the console.

                'Dim returndata As String = Encoding.ASCII.GetString(bytes, 0, CInt(tcpClient.ReceiveBufferSize))

                'Dim returndata As String = CType(sender, NetworkStream).Read(bytes, 0, tcpClient.ReceiveBufferSize)
                'Dim returndata As String = Encoding.ASCII.GetString(bytes, 0, bytes.Length)
                'Dim myCompleteMessage As StringBuilder = New StringBuilder()
                'myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(bytes, 0, bytes.Length))
                'Dim returndata As String = myCompleteMessage.ToString



                ' Receive the TcpServer.response.
                ' Buffer to store the response bytes.
                Dim Data = New [Byte](255) {}

                ' String to store the response ASCII representation.
                Dim responseData As [String] = [String].Empty

                ' Read the first batch of the TcpServer response bytes.
                Dim bytes As Int32 = networkStream.Read(Data, 0, Data.Length)
                responseData = System.Text.Encoding.ASCII.GetString(Data, 0, bytes)

                Dim returndata As String = responseData

                ' Close everything.
                'stream.Close()
                'client.Close()

                'TextBox1.Text = (("Host returned: " + returndata))
                ''TextBox1.Text = (TextBox1.Text + returndata)
                ''TextBox1.Text = TextBox1.Text + " "
                'TextBox1.Text = TextBox1.Text + Chr(13) & Chr(10)


                ''If TextBox1.Text.Length > 600 Then
                ''TextBox1.Text = ""
                ''End If
                'TextBox1.Text = returndata.Trim.Length
                'Dim w() As String = Split(returndata, " ")
                returndata2 = CInt(returndata)
                'returndata2 = returndata
                'returndata2 = returndata2 + Trim(returndata)
                'If returndata2.Length < 330 Then

               
                TextBox1.Text = returndata2.Length
                If returndata2.Length > -1 Then
                    p = p + 1
                    Dim graph As Graphics = PictureBox1.CreateGraphics
                    graph.DrawLine(New Pen(Color.Red, 1), p - 1, s, p, 470 - returndata2 * 0.8)
                    s = 470 - returndata2 * 0.8

                    If p >= 600 Then
                        p = 0
                        graph.Clear(Color.Black)
                    End If
                End If
                'Else
                If Not networkStream.CanRead Then
                    TextBox1.Text = ("cannot not write data to this stream")
                    tcpClient.Close()
                Else
                    If Not networkStream.CanWrite Then
                        TextBox1.Text = ("cannot read data from this stream")
                        tcpClient.Close()
                    End If
                End If
                If returndata2.Length < 200 Then
                    Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("1")
                    networkStream.Write(sendBytes, 0, sendBytes.Length)
                    returndata2 = ""
                End If

            End If

        End Sub

        Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
            Timer1.Enabled = True
        End Sub
    End Class
    [28-30.06.2022, targi] PowerUP EXPO 2022 - zasilanie w elektronice. Zarejestruj się za darmo