mikrocontroller.net

Forum: PC-Programmierung String versenden über TCP/IP mit Objectiv-C


Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Community

Ich möchte über TCP/IP einen String an einen Server versenden. Plattform 
ist MacOS X 10.5, Programmiersprache Objectiv-C. Die Verbindung mit dem 
Server kann ich aufbauen, der Socket steht also. Nun weiss ich aber 
nicht ob mit der von mir verwendeten Methode überhaupt ein String raus 
geht. Auf jedenfall kommt nichts beim Server an! Deshalb meine Frage an 
euch: Wie könnte ich überprüfen ob und was da über meine TCP-Verbindung 
raus geht. Und meine zweite Frage: Wenn da tatsächlich nichts rausgeht, 
was mach ich falsch??
Hat hier jemand Erfahrung mit Objectiv-C?


Hier noch mein Code:
- (IBAction)searchForSite 
{ 
   NSString *urlStr = @"192.168.1.21"; //server IP
   NSHost *host = [NSHost hostWithName:urlStr]; 
   NSString *sendData = @"IP_ClIENT_OPEN"; //String to send

   //create iStream and oStream objects and set port-nr
   [NSStream getStreamsToHost:host port:1319 inputStream:&iStream outputStream:&oStream]; 

   //open input-stream and output-stream
   [iStream retain]; 
   [oStream retain]; 
   [iStream setDelegate:self]; 
   [oStream setDelegate:self]; 
   [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
   [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
   [iStream open]; 
   [oStream open];

   if (iStream) {
      NSLog (@"Streamevent bytes");
      uint8_t *buf[1024];
      unsigned int len = 0;
      len = [(NSInputStream *)iStream read:buf maxLength:1024];
      NSLog(@"Puffer: %s",buf);
      NSData *data = [NSData dataWithBytes:(const void *)buf length:len];
      if (data) {
         NSLog(@"Data: %@",data);
      }
      NSString *part = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
      NSLog (@"Part %p",part);
      [oStream write:sendData maxLength:strlen(sendData)];
      NSLog(@"End");
   }
}

Gruss
Pascal

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit Objective-C habe ich mich noch nicht auseinandergesetzt, auch wenn 
das als einer der nächsten Weiterbildungspunkte auf der Tagesordnung 
steht.

Daher nur etwas uninformiertes Raten:

Ist "IP_ClIENT_OPEN" ein Tippfehler? (kleines 'l')

Dann wertest Du anscheinend die korrekte Erzeugung von iStream aus, 
aber nicht die von oStream, ist das beabsichtigt?

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ist tatsächlich ein Tippfehler in meinem String. Aber der tut im 
Moment noch nichts zur Sache, denn der String kommt noch gar nicht beim 
Server an.

Ja das ist richtig, hier werte ich nur iStream aus. Ich habe hier der 
lesbarkeit halber nicht den gesamten Code gepostet. Ob die Objekte 
iStream und oStream richtig geöffnet wurden frage ich vorher schon ab. 
Diese Methode schrieb ich eigentlich erst nur für den ausgehenden 
Datenstrom. Da ich aber schlussendlich die Kommunikation auf beiden 
Seiten brauche habe ich hier noch oStream hinein genommen um zu testen 
ob die Kommunikation auch funktioniert.
Tut sie eben nicht und ich weiss einfach nicht wieso. Vorallem bin ich 
mir auch gar nicht so sicher ob wirklich nichts rausgeht. Ich wüsste 
nicht wie ich das Prüfen sollte!?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn hier nichts rauskommt, solltest du es vielleicht mal im
Heise-Forum probieren
(http://www.heise.de/developer/foren/S-C-C/forum-44546/list/).

Da geistert ein Tom9811 o.s.ä. rum, der zwar manchmal etwas
schrullig ist, aber sehr engagiert was Objective C angeht.

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für den Hinweis! Mit schrullig kann ich umgehen, werde es 
also dort mal versuchen ;-)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  Vorallem bin ich mir auch gar nicht so sicher ob wirklich
> nichts rausgeht. Ich wüsste nicht wie ich das Prüfen sollte!?

Du könntest eine Packet-Capturing-Software wie Wireshark verwenden, und 
Deiner Clientanwendung auf die Protokollfinger sehen.

Wireshark gibt's auch für Mac OS X: http://www.wireshark.org/

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist Wireshark nicht in etwa das Selbe wie der PaketAnalyzer?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kommt drauf an, was "PacketAnalyzer" ist ;-)

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der PaketAnalyzer für Mac:
http://www.tastycocoabytes.com/cpa/index.php

Ich glaube ich bin ein kleiner Schritt weiter gekommen um mein Problem 
zu lösen. Allerdings stehe ich auch dort wieder an.
Mein Problem ist wahrscheinlich beim Event-Handling von Streams zu 
suchen. Wenn ich den Stream geöffnet habe muss ich ihn mit 
Event-Handling irgendwie beschäftigen. Ich hätte zwar ein gutes Dokument 
dazu gefunden 
(http://developer.apple.com/documentation/Cocoa/Con...), 
aber ich kapier das Event-Handling überhaupt. Was ist die Idee hinter 
dem Event-Handling? Und wie bindet man das ein?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom9811 fragen...

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das werde ich Klaus... aber das doofe Heise-Forum hat eine 24h 
Wartefrist bis man da was machen kann nachdem man sich angemeldet hat..
Dann werd ich wohl bis morgen Nachmittag warten müssen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.