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


von Pascal (Gast)


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:
1
- (IBAction)searchForSite 
2
{ 
3
   NSString *urlStr = @"192.168.1.21"; //server IP
4
   NSHost *host = [NSHost hostWithName:urlStr]; 
5
   NSString *sendData = @"IP_ClIENT_OPEN"; //String to send
6
7
   //create iStream and oStream objects and set port-nr
8
   [NSStream getStreamsToHost:host port:1319 inputStream:&iStream outputStream:&oStream]; 
9
10
   //open input-stream and output-stream
11
   [iStream retain]; 
12
   [oStream retain]; 
13
   [iStream setDelegate:self]; 
14
   [oStream setDelegate:self]; 
15
   [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
16
   [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
17
   [iStream open]; 
18
   [oStream open];
19
20
   if (iStream) {
21
      NSLog (@"Streamevent bytes");
22
      uint8_t *buf[1024];
23
      unsigned int len = 0;
24
      len = [(NSInputStream *)iStream read:buf maxLength:1024];
25
      NSLog(@"Puffer: %s",buf);
26
      NSData *data = [NSData dataWithBytes:(const void *)buf length:len];
27
      if (data) {
28
         NSLog(@"Data: %@",data);
29
      }
30
      NSString *part = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
31
      NSLog (@"Part %p",part);
32
      [oStream write:sendData maxLength:strlen(sendData)];
33
      NSLog(@"End");
34
   }
35
}

Gruss
Pascal

von Rufus Τ. F. (rufus) Benutzerseite


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?

von Pascal (Gast)


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!?

von Klaus W. (mfgkw)


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.

von Pascal (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


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/

von Pascal (Gast)


Lesenswert?

Ist Wireshark nicht in etwa das Selbe wie der PaketAnalyzer?

von Rolf Magnus (Gast)


Lesenswert?

Kommt drauf an, was "PacketAnalyzer" ist ;-)

von Pascal (Gast)


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/Conceptual/Streams/Streams.pdf), 
aber ich kapier das Event-Handling überhaupt. Was ist die Idee hinter 
dem Event-Handling? Und wie bindet man das ein?

von Klaus W. (mfgkw)


Lesenswert?

Tom9811 fragen...

von Pascal (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.