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:
weiter geht's unten...
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
Comment