Appdev
Appdev

Reputation: 33

GCDAsyncSocket readData not called

I'm trying to send a message to a server and receive a response using my iPhone. I can connect to the server using:

telnet 123.123.123.1 6000
Trying 123.123.123.1...
Connected to 123.123.123.1.
Escape character is '^]'.
?VERSION
OK
VERSION=PROTOCOL: 1.1.0 

?VERSION is my question

OK states it received and understood the question

VERSION= is the response from the server

so I'm trying to do the same thing but with xcode

So I have this in my viewDidLoad

dispatch_queue_t mainQueue = dispatch_get_main_queue();
asyncSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:mainQueue];
asyncSocket.delegate = self;

NSString *host = @"123.123.123.1";
uint16_t port = 6000;

NSLog(@"Connecting to \"%@\" on port %hu...", host, port);

NSError *error = nil;
if (![asyncSocket connectToHost:host onPort:port withTimeout:5.0 error:&error])
{
    NSLog(@"Error connecting: %@", error);
}
else
{
    NSLog(@"Connecting...");
}

And I have the following code showing it connected

-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:
(UInt16)port

{
NSLog(@"socket:%p didConnectToHost:%@ port:%hu", sock, host, port);

// We're just going to send a test string to the server.

NSString *myStr = @"?VERSION";
NSData *myData2 = [myStr dataUsingEncoding:NSUTF8StringEncoding];

[asyncSocket writeData:myData2 withTimeout:-1 tag:0];


}

And the following to show it wrote

-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag{
NSLog(@"WRITING");
[asyncSocket readDataToData:[GCDAsyncSocket LFData] withTimeout:-1 tag:0];
}

Sadly this never gets called

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{


NSString *tempString = [[NSString alloc]initWithData:data 
                                        encoding: NSUTF8StringEncoding];


}

I'm lost and really need some assistance

Upvotes: 3

Views: 2038

Answers (1)

Michal
Michal

Reputation: 15669

It is because you say write AND read at the same time. First call [asyncSocket writeData:myData2 withTimeout:-1 tag:0]; and in didWriteDataWithTag call [asyncSocket readDataToData:[GCDAsyncSocket LFData] withTimeout:-1 tag:0];. You are on one thread - dispatch_get_main_queue() - it can't do two things at one time.

Upvotes: 3

Related Questions