Announcement

Collapse
No announcement yet.

TCP-Verbindung Problem

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TCP-Verbindung Problem

    Hallo,

    ich baue eine TCP-Verbindung zwischen einem Windows PC und einem Windows
    Mobile 5 Gerät auf um Strings zu übertragen. Wenn ich das Gerät über Active
    Sync mit dem PC verbunden habe klappt alles wunderbar, wenn ich die
    Verbindung allerdings über GPRS aufbaue, dann bekomme ich immer häufiger
    folgende Fehler:

    System.IO.IOException: Von der Übertragungsverbindung können keine Daten
    gelesen werden. ---> System.Net.Sockets.SocketException: Ein
    Blockierungsvorgang wurde durch einen Aufruf von "WSACancelBlockingCall"
    unterbrochen
    bei System.Net.Sockets.Socket.ReceiveNoCheck()
    at ReceiveAsyncRequest.doRequest()
    at AsyncRequest.handleRequest()
    at WorkerThread.doWork()
    at WorkerThread.doWorkI()
    at WorkItem.doWork()
    bei System.Threading.Timer.ring()

    bei System.Net.Sockets.NetworkStream.EndRead()
    bei bau_mobil.Sender.ReadStream()
    bei System.Net.LazyAsyncResult.InvokeCallback()
    at WorkerThread.doWork()
    at WorkerThread.doWorkI()
    at WorkItem.doWork()
    bei System.Threading.Timer.ring()

    und

    System.NullReferenceException: NullReferenceException
    bei bau_mobil.Sender.ReadStream()
    bei System.Net.LazyAsyncResult.InvokeCallback()
    at WorkerThread.doWork()
    at WorkerThread.doWorkI()
    at WorkItem.doWork()
    bei System.Threading.Timer.ring()

    Was kann ich machen? Liegt es an der Internet-Verbindung? Oder am Verfahren
    wie ich die Daten übertrage?

    Windows-Seite:

    Code:
    Public Class Reciever
    
    Public Event Recieved(ByVal puffer As String, ByVal Client As Client)
    Public Event ClientErrorHandler(ByVal errNo As Integer, ByVal Client
    As Client)
    Public Event ErrorHandler(ByVal errNo As Integer)
    
    Private _lastActivity As DateTime = Nothing
    Private thread_Server As Thread
    Private hashtable_AllClients As Hashtable
    Private tcplistener As TcpListener
    Private integer_port As Integer = 0
    Private ipaddress_localAddr As IPAddress = Nothing
    
    Private dbUser As String
    Private dbPassword As String
    Private dbServer As String
    Private dbCatalog As String
    
    Public Property DatabaseUser() As String
    Get
    Return dbUser
    End Get
    Set(ByVal value As String)
    dbUser = value
    End Set
    End Property
    
    Public Property DatabasePassword() As String
    Get
    Return dbPassword
    End Get
    Set(ByVal value As String)
    dbPassword = value
    End Set
    End Property
    
    Public Property DatabaseServer() As String
    Get
    Return dbServer
    End Get
    Set(ByVal value As String)
    dbServer = value
    End Set
    End Property
    
    Public Property DatabaseCatalog() As String
    Get
    Return dbCatalog
    End Get
    Set(ByVal value As String)
    dbCatalog = value
    End Set
    End Property
    
    ' Auslistung der Error-Status
    Public Enum EnumError As Integer
    ErrorStopReviever = -1
    ErrorStartReciever = -2
    ErrorAllreadyRunning = -3
    ErrorAllreadyStopped = -4
    ErrorNoIP = -5
    ErrorNoPort = -6
    ErrorIP = -7
    End Enum
    
    ' Auflistung der Status des Recievers
    Public Enum EnumStatus As Integer
    Running = 1
    Stopped = 0
    Unknown = -1
    End Enum
    
    Public ReadOnly Property LastActivity() As DateTime
    Get
    Return _lastActivity
    End Get
    End Property
    
    Public Property Clients() As Hashtable
    Get
    Return hashtable_AllClients
    End Get
    Set(ByVal value As Hashtable)
    hashtable_AllClients = value
    End Set
    End Property
    
    
    ' IP auf der gehorcht wird
    Public Property Port() As Integer
    Get
    Return integer_port
    End Get
    Set(ByVal Value As Integer)
    integer_port = Value
    End Set
    End Property
    
    ' Port auf dem gehort wird
    Public Property IPAddress() As IPAddress
    Get
    Return ipaddress_localAddr
    End Get
    Set(ByVal Value As IPAddress)
    If (Value Is Nothing) Then
    RaiseEvent ErrorHandler(EnumError.ErrorIP)
    Else
    ipaddress_localAddr = Value
    End If
    
    End Set
    End Property
    
    ' Status des Recievers
    Public ReadOnly Property Status() As Integer
    Get
    If (thread_Server Is Nothing) Then
    Return EnumStatus.Stopped
    Else
    If (thread_Server.ThreadState = ThreadState.Running) Then
    Return EnumStatus.Running
    ElseIf (thread_Server.ThreadState = ThreadState.Stopped)
    Then
    Return EnumStatus.Stopped
    Else
    Return EnumStatus.Unknown
    End If
    End If
    
    End Get
    End Property
    
    ' Kostruktor...
    Public Sub New()
    ' Hier passiert mal nix..
    End Sub
    
    ' Kostruktor...
    Public Sub New(ByVal Port As Integer, ByVal IPAdress As IPAddress)
    integer_port = Port
    ipaddress_localAddr = IPAdress
    End Sub
    
    ' Starten des Recievers
    Public Sub StartReciever()
    
    If (ipaddress_localAddr Is Nothing) Then
    
    RaiseEvent ErrorHandler(EnumError.ErrorNoIP)
    
    Else
    
    If (integer_port = 0) Then
    
    RaiseEvent ErrorHandler(EnumError.ErrorNoPort)
    
    Else
    
    Try
    If (thread_Server Is Nothing) Then
    thread_Server = New Thread(AddressOf
    ListenForClients)
    thread_Server.Name = "ListenForClients"
    hashtable_AllClients = New Hashtable
    thread_Server.Start()
    Else
    RaiseEvent
    ErrorHandler(EnumError.ErrorAllreadyRunning)
    End If
    Catch ex As Exception
    RaiseEvent ErrorHandler(EnumError.ErrorStartReciever)
    End Try
    
    End If
    
    End If
    
    
    End Sub
    
    ' Stoppen des Recievers
    Public Sub StopReciever()
    Try
    If (thread_Server Is Nothing) Then
    RaiseEvent
    ErrorHandler(Reciever.EnumError.ErrorAllreadyStopped)
    Else
    If Not (hashtable_AllClients Is Nothing) Then
    For Each _client As Client In
    hashtable_AllClients.Values
    Try
    'CType(o, Client).Disconnect()
    _client.Disconnect()
    Catch
    End Try
    Next
    End If
    hashtable_AllClients = Nothing
    thread_Server.Abort()
    thread_Server = Nothing
    tcplistener.Stop()
    tcplistener = Nothing
    End If
    Catch ex As Exception
    RaiseEvent ErrorHandler(EnumError.ErrorStopReviever)
    End Try
    End Sub
    
    ' Auf Clients horchen...
    Private Sub ListenForClients()
    Try
    tcplistener = New TcpListener(ipaddress_localAddr,
    integer_port)
    tcplistener.Start()
    Do
    Dim client As New Client(tcplistener.AcceptTcpClient,
    dbServer, dbCatalog, dbUser, dbPassword)
    ' Handler vom Client registrieren damit auf
    Benachrichtungen
    ' reagiert werden kann
    AddHandler client.Connected, AddressOf OnConnected
    AddHandler client.Disconnected, AddressOf OnDisconnected
    AddHandler client.Recieved, AddressOf OnRecieved
    AddHandler client.ClientErrorHandler, AddressOf
    OnClientErrorHandler
    hashtable_AllClients.Add(client.ID, client)
    Loop Until False
    Catch ex As Exception
    End Try
    End Sub
    
    ' Wird ausgelöst wenn ein Client Daten geschickt hat
    Private Sub OnRecieved(ByVal puffer As String, ByVal Client As Client)
    _lastActivity = System.DateTime.Now
    RaiseEvent Recieved(puffer, Client)
    End Sub
    
    ' Wird ausgelöst wenn sich ein Client angemeldet hat
    Private Sub OnConnected()
    End Sub
    
    ' Wird ausgelöst wenn sich ein Client abgemeldet hat
    Private Sub OnDisconnected(ByVal Client As Client)
    If (Not hashtable_AllClients Is Nothing) Then
    Client.CloseDatabaseConnection()
    hashtable_AllClients.Remove(Client.ID)
    End If
    End Sub
    
    
    ' Wird durch einen Fehler beim Client ausgelöst
    Private Sub OnClientErrorHandler(ByVal errNo As Integer, ByVal
    Client As Client)
    RaiseEvent ClientErrorHandler(errNo, Client)
    End Sub
    
    ' Wird bei einem Fehler ausgelöst
    Private Sub OnErrorHandler(ByVal errNo As Integer)
    RaiseEvent ErrorHandler(errNo)
    End Sub
    
    ' Liefert die Anzahl der angemeldeten Clients zurück
    Function CountClients() As Integer
    If (hashtable_AllClients Is Nothing) Then
    Return 0
    Else
    Return hashtable_AllClients.Count
    End If
    End Function
    
    Public Sub DisconnectAllClients()
    
    For Each _cl As Client In hashtable_AllClients.Values
    _cl.CloseDatabaseConnection()
    Next
    
    hashtable_AllClients = Nothing
    
    End Sub
    
    ' Anhand der Fehlernummer liefert diese Funktion eine Fehlermeldung
    zurück
    Public Function GetRecieverError(ByVal Fehlernummer As Integer) As
    String
    
    Select Case (Fehlernummer)
    Case EnumError.ErrorAllreadyRunning
    GetRecieverError = "Der Server läuft schon."
    Case EnumError.ErrorAllreadyStopped
    GetRecieverError = "Der Server läuft nicht."
    Case EnumError.ErrorStartReciever
    GetRecieverError = "Der Server konnte nicht gestartet
    werden."
    Case EnumError.ErrorStopReviever
    GetRecieverError = "Der Server konnte nicht gestoppt
    werden."
    Case EnumError.ErrorNoIP
    GetRecieverError = "Es wurde keine IP Adresse vergeben."
    Case EnumError.ErrorNoPort
    GetRecieverError = "Es wurde kein Port vergeben."
    Case EnumError.ErrorIP
    GetRecieverError = "Die angegebene IP-Adresse ist
    fehlerhaft."
    Case Else
    GetRecieverError = "Unbekannter Fehler."
    End Select
    
    End Function
    
    End Class
    weiter geht's unten...

  • #2
    Code:
    Public Class Client
    
    Public Event Connected()
    Public Event Disconnected(ByVal Client As Client)
    Public Event Recieved(ByVal puffer As String, ByVal Client As Client)
    Public Event ClientErrorHandler(ByVal errNo As Integer, ByVal Client
    As Client)
    
    Private Const BUFFER_SIZE As Integer = 2048
    Dim guid_ClientID As Guid = Guid.NewGuid ' Eindeutige Client-ID
    erzeugen
    Dim tcpclient As TcpClient
    Dim byte_data(BUFFER_SIZE) As Byte
    Dim arraylist_daten As ArrayList
    Dim ok As String
    Dim _lastActivity As DateTime = System.DateTime.Now
    Private conn As SqlConnection
    Private dbUser As String
    Private dbPassword As String
    Private dbServer As String
    Private dbCatalog As String
    
    Public Property LastActivity() As DateTime
    Get
    Return _lastActivity
    End Get
    Set(ByVal value As DateTime)
    _lastActivity = value
    End Set
    End Property
    
    Public Property DBConnection() As SqlConnection
    Get
    Return conn
    End Get
    Set(ByVal value As SqlConnection)
    conn = value
    End Set
    End Property
    
    Public Enum EnumError As Integer
    ErrorDataRecieved = -1
    ErrorSend = -2
    ErrorDisconnected = -3
    End Enum
    
    ' Konstruktor...
    Public Sub New(ByVal p_tcpclient As TcpClient, ByVal DatabaseServer
    As String, ByVal DatabaseCatalog As String, ByVal DatabaseUser As String,
    ByVal DatabasePassword As String)
    dbServer = DatabaseServer
    dbCatalog = DatabaseCatalog
    dbUser = DatabaseUser
    dbPassword = DatabasePassword
    Me.tcpclient = p_tcpclient
    tcpclient.GetStream.BeginRead(byte_data, 0, BUFFER_SIZE,
    AddressOf ReadStream, Nothing)
    conn = New SqlConnection("Data Source=" & dbServer & ";Initial
    Catalog=" & dbCatalog & ";User ID=" & dbUser & ";Password=" & dbPassword & ";
    Integrated Security=False;")
    RaiseEvent Connected()
    End Sub
    
    ' Stream vom Client lesen
    Private Sub ReadStream(ByVal ar As IAsyncResult)
    
    Dim intCount As Integer
    Dim text As String
    
    Try
    SyncLock tcpclient.GetStream
    intCount = tcpclient.GetStream.EndRead(ar)
    End SyncLock
    If intCount < 1 Then
    RaiseEvent
    ClientErrorHandler(EnumError.ErrorDisconnected, Me)
    RaiseEvent Disconnected(Me)
    Exit Sub
    End If
    
    ' Empfangene Daten in Text umwandeln
    text = Encoding.Default.GetString(byte_data, 0, intCount)
    ' Empfangener String "DISCONNECT" veranlasst zum schließen
    der Verbindung
    If (text.ToString() = "DISCONNECT") Then
    Disconnect()
    Else
    ' Event Recvied auslösen, dadurch wird der empfangene
    Text an
    ' die Klasse, die den Reciever implementiert weitergegeben
    RaiseEvent Recieved(text, Me)
    _lastActivity = System.DateTime.Now
    End If
    SyncLock tcpclient.GetStream
    tcpclient.GetStream.BeginRead(byte_data, 0, BUFFER_SIZE,
    AddressOf ReadStream, Nothing)
    End SyncLock
    Catch ex As Exception
    RaiseEvent ClientErrorHandler(EnumError.ErrorDataRecieved, Me)
    RaiseEvent Disconnected(Me)
    End Try
    End Sub
    
    ' Daten an Client senden
    Public Sub Send(ByVal data As String)
    Try
    Dim w As New IO.StreamWriter(tcpclient.GetStream,
    System.Text.Encoding.Default)
    w.Write(data)
    w.Flush()
    w = Nothing
    Catch ex As Exception
    RaiseEvent ClientErrorHandler(EnumError.ErrorSend, Me)
    End Try
    End Sub
    
    ' ID des Clienst abfragen
    Public ReadOnly Property ID() As String
    Get
    Return guid_ClientID.ToString
    End Get
    End Property
    
    Public Sub Disconnect()
    Me.tcpclient.GetStream.Close()
    Try
    If Not (conn Is Nothing) Then
    If (conn.State <> ConnectionState.Closed) Then
    conn.Close()
    End If
    End If
    Catch
    End Try
    RaiseEvent Disconnected(Me)
    End Sub
    
    Public Sub CloseDatabaseConnection()
    
    Try
    If Not (conn Is Nothing) Then
    If (conn.State <> ConnectionState.Closed) Then
    conn.Close()
    End If
    End If
    Catch
    End Try
    
    End Sub
    
    End Class
    Windows Mobile Seite:

    Code:
    Public Class Sender
    
    Public Event Recieved(ByVal puffer As String)
    Public Event ErrorHandler(ByVal ErrNo As Integer)
    
    Private Const BUFFER_SIZE As Integer = 1024
    Dim tcpclient As TcpClient
    Dim integer_Port As Integer
    Dim string_Host As String
    Dim byte_data(BUFFER_SIZE) As Byte
    Dim integer_status As Integer = 0
    Dim ok As String
    Dim arraylist_daten As ArrayList
    
    Public Enum EnumStatus As Integer
    Disconnected = 0
    Connected = 1
    End Enum
    
    Public Enum EnumError As Integer
    ErrorRecieved = -1
    ErrorSend = -2
    ErrorConnect = -3
    ErrorDisconnect = -4
    End Enum
    
    Public Property Port() As Integer
    Get
    Return integer_Port
    End Get
    Set(ByVal Value As Integer)
    integer_Port = Value
    End Set
    End Property
    
    Public Property Host() As String
    Get
    Return string_Host
    End Get
    Set(ByVal Value As String)
    string_Host = Value
    End Set
    End Property
    
    Public ReadOnly Property Status() As Integer
    Get
    Return integer_status
    End Get
    End Property
    
    Public Sub Connect()
    Try
    tcpclient = New TcpClient(string_Host, integer_Port)
    tcpclient.GetStream.BeginRead(byte_data, 0, BUFFER_SIZE,
    AddressOf ReadStream, Nothing)
    integer_status = EnumStatus.Connected
    Catch ex As Exception
    frm_main.Log("Connect: " & ex.ToString())
    RaiseEvent ErrorHandler(EnumError.ErrorConnect)
    integer_status = EnumStatus.Disconnected
    End Try
    
    End Sub
    
    Public Sub Disconnect()
    Try
    'Send("DISCONNECT")
    If (tcpclient IsNot Nothing) Then
    tcpclient.Client.Close()
    tcpclient.Close()
    tcpclient = Nothing
    End If
    integer_status = EnumStatus.Disconnected
    Catch ex As Exception
    frm_main.Log("Disconnect: " & ex.ToString())
    RaiseEvent ErrorHandler(EnumError.ErrorDisconnect)
    End Try
    End Sub
    
    Public Sub Send(ByVal data As String)
    Try
    Dim w As New IO.StreamWriter(tcpclient.GetStream)
    w.Write(data)
    w.Flush()
    w = Nothing
    Catch ex As Exception
    frm_main.Log("Send: " & ex.ToString())
    RaiseEvent ErrorHandler(EnumError.ErrorSend)
    integer_status = EnumStatus.Disconnected
    End Try
    End Sub
    
    Private Sub ReadStream(ByVal ar As IAsyncResult)
    
    Dim text As String
    Dim intCount As Integer
    
    Try
    SyncLock tcpclient.GetStream
    intCount = tcpclient.GetStream.EndRead(ar)
    End SyncLock
    If intCount < 1 Then
    integer_status = EnumStatus.Disconnected
    RaiseEvent ErrorHandler(EnumError.ErrorDisconnect)
    Exit Sub
    End If
    text = Encoding.Default.GetString(byte_data, 0, intCount)
    RaiseEvent Recieved(text.ToString())
    SyncLock tcpclient.GetStream
    tcpclient.GetStream.BeginRead(byte_data, 0, BUFFER_SIZE,
    AddressOf ReadStream, Nothing)
    End SyncLock
    Catch ex As Exception
    frm_main.Log("Read: " & ex.ToString())
    If (integer_status = EnumStatus.Connected) Then
    RaiseEvent ErrorHandler(EnumError.ErrorRecieved)
    End If
    End Try
    End Sub
    
    End Class
    Ich bin für jede Hilfe dankbar!

    Gruß
    Daniel

    Comment


    • #3
      Der Fehlt hat sich erledigt!

      Comment

      Working...
      X