hakan
hakan

Reputation: 906

Can't send message via IOS socket

I'm building an IOS socket client using CFStream. I've managed to connect to my test server and receive messages from it. The problem is if client sends a message server can not receive it, and after that client does not receive any message from server. My code is as follows. What could be wrong?

- (void)initCommunicationWithAddress:(NSString*) address withPort:(int) port
{
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)address, port, &readStream, &writeStream);

    self.inputStream = (__bridge_transfer NSInputStream *)readStream;
    self.outputStream = (__bridge_transfer NSOutputStream *)writeStream;

    [self.inputStream setDelegate:self];
    [self.outputStream setDelegate:self];
    [self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [self.inputStream open];
    [self.outputStream open];
    NSLog(@"Socket Init: %@", @"");
}

- (void)sendMessage:(NSString*)msg
{
    msg =  @"hello";
    NSLog(@"SendMessage: %@", msg);
    NSData *data = [[NSData alloc] initWithData:[msg dataUsingEncoding:NSASCIIStringEncoding]];
    [self.outputStream write:[data bytes] maxLength:[data length]];
}

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {

    switch (streamEvent) {

        case NSStreamEventOpenCompleted:
            [self streamOpened];
            break;

        case NSStreamEventHasBytesAvailable:
            NSLog(@"Stream Bytes Available:%@", @"");
            if (theStream == self.inputStream) {

                NSMutableData* data = [NSMutableData data];
                uint8_t buffer[1024];
                int len;
                int bytesRead = 0;

                while ([self.inputStream hasBytesAvailable])
                {
                    len = [self.inputStream read:buffer maxLength:sizeof(buffer)];
                    if (len > 0) {

                        [data appendBytes:(const void *)buffer length:len];
                        bytesRead = bytesRead + len;
                    }
                }

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

                if (nil != output) {
                    [self HandleServerMessage: output];

                }
            }
            break;

        case NSStreamEventErrorOccurred:
             NSLog(@"Stream Error:%@", @"");
            [self streamError];
            break;

        case NSStreamEventEndEncountered:
            NSLog(@"Stream Event End:%@", @"");
            [theStream close];
            [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
            [self streamEnd];
            break;

        default:
            NSLog(@"Unknown event");
    }
}

Upvotes: 1

Views: 1256

Answers (1)

hakan
hakan

Reputation: 906

I figured out my mistake. I should wait for NSStreamEventHasSpaceAvailable event or check if space is available before sending any message to server.

Upvotes: 1

Related Questions