none
Mango Socket Implementierung - Incomplete? RRS feed

  • Allgemeine Diskussion

  • Ich versuche gerade aus der Socket Implementierung für Mango schlau zu werden. Wie es aussieht wurde da ja der grossteil der bekannten Socket-Klasse einfach "wegoptimiert" oder anders implementiert.

    Wenn ich mir anschaue was System.Net.Sockets von Silverlight anbietet und was die Phone-Variante bietet wird mir schlecht (und finde es fast schon eine zumuting diese Klasse gleich zu benennen)

    - Es gibt ein Sync-Pattern (Send/Receive) und ein Async-Pattern (BeginSend/EndSend und BeginReceive/EndReceive) nicht aber am Phone. Hier gibts nur ein 'anderes' async pattern ReceiveAsync und SendAsync. D.h. wenn der Socket mal doch eine "vollständige Socket Klasse wird" wird kann ich meine Implementierung neu machen?

    - Es gibt _keine_ Möglichkeit ein Timeout bei einem Receive anzugeben (ich habe zumindest nach 3 Tagen Suche noch nichts gefunden) Es gibt nichtmal eine Möglichkeit ein pending Receive abzubrechen (CancelReceive?)

    - Klar... Sockets heist in Mange es gibt Sockets aber sonst keinerlei der nützlichen "utilitiy" Klassen

    -- TclClient ... Fehlanzeige. Hab versucht das nachzuimplementieren aber ohne einer Möglichkeit ein 'Avail' an einen Socket zu senden geht das vermutlich nicht

    -- Dns ... Fehlanzeige. UDP-Sockets gibt's auch keine also kann das nichtmal nachimplementiert werden (z.B: das Auflösen eines DNS-Eintrags auf _alle_ ID-Adressen, oder so 'unwichtige' Sachen einen TXT oder SRV-Record aus dem DNS zu lesen...)

     

    Meine Test-App hab ich mittlerweile schon zu einem Simplen Telnet-Client heruntergeschraubt. Aber wie bitte soll ich das implenmentieren wenn z.B: nichtmal eine Möglichkeit habe Timeouts beim Receive zu spezifizieren - bzw. nichtmal irgendwo mitbekomme welche Timeouts überhaupt eingestellt sind .... und wenn ich einfach auf gut Glück ein Receive absetze wie kann ich das cancelen (natürlich ohne die TCP-Verbindung mittels Shudtown zu trennen?)

     

    • Typ geändert Robert Breitenhofer Freitag, 30. September 2011 14:07 Keine Rückmeldung des Fragenstellender
    Dienstag, 30. August 2011 09:06

Alle Antworten

  • Hallo SchRobert,

    ich habe zwar Tcp und Udp noch nie in Projekten direkt benutzt aber nach kurzer Recherche bin ich auf den folgenden msdn-Artikel gestoßen: Sockets for Windows Phone

    Insbesondere die Artikel How to: Create and Use a TCP Socket Client Application for Windows Phone und How to: Create and Use a UDP Socket Client Application for Windows Phone scheinen sehr interessant zu sein. In beiden Beispielen sehe ich auch auch TIME_OUT's, ich weiß zwar nicht ob du diese Beispiele kennst oder bereits ausprobiert hast aber vielleicht helfen dir diese weiter.

     


    Gruß

    Rudolf

    "Der Nachteil der Intelligenz besteht darin, dass man ununterbrochen gezwungen ist, dazuzulernen." Georg Bernhard Shaw

    Dienstag, 30. August 2011 09:18
  • Ja das TCP Beispiel kenne ich. Hier werden die Timeouts auf das WaitOne angewandt. D.h. es wird einfach nur eine gewisse Zeit auf die antwort gewartet und dann einfach weiter gemacht. Der Request wird aber nicht abgebrochen und wenn dann später mal eine Reponse anommen sollte gehen diese Daten infach verloren.

    Auch ist es problematisch wenn du aus dem WaitOne raus gehts - weil du davon ausgehts dass keine Daten gekommen sind, der Request aber noch aktiv ist und du kurz danach einen weiteren Receive-Request auf denselben Socket absetzen willst: Welcher erlält dann die einkommenden Daten???

    So wie es aktuell implementiert ist sind die Sockets eigentlich nur für One-Show Request/Response Verbindungen brauchbar aber nicht wirklich für Streaming und apps die dynamisch auf einkommende Daten reagieren müssen - je nachdem was gesendet wurde, also eigentlich alles von XMPP über VNC bis SSH/Telnet nicht wirklich optimal nutzbar.

    Ich hab jetzt mal eine "emulation" versucht indem ich im Avialable-Check einfach versuche ein Byte zu lesen und nur 1ms zu warten (d.H: mein Avialable liefert 0 oder 1) aber das hängt stark davon ab wie sich der überliegende Stream verhält - schlimmstenfalls sende ich dann lauter Receive() mit 1 Byte ab was wohl nicht so tolle Performance liefern wird.

     

    Das UDP-Sample finde ich interessant, vorallem weil in der Mango-Dokumentation vom Socket explizit "only TCP supported" drinnen steht. Mal schauen, vielleicht versuche ich mich ja noch an einem DNS-Sample :-)

    Dienstag, 30. August 2011 11:25
  • Hey Robert,

    darf man erfahren, ob dir das UDP-Beispiel weitergeholfen hat und wie du das bei den TCP weiter gemacht hast?


    Gruß
    Rudolf

    "Der Nachteil der Intelligenz besteht darin, dass man ununterbrochen gezwungen ist, dazuzulernen." Georg Bernhard Shaw
    Sonntag, 11. September 2011 21:52
  • ****************************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    ****************************************************************************************************************
    Freitag, 30. September 2011 14:07