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:
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