user3088441
user3088441

Reputation: 5

Unable to establish a Socket connection through IOS

Im writing an IOS application for my first time. It is supposed to connect to a static IP device, and send certain "known" commands to it. But for some reason Im unable to establish a connection.

Bellow are the functions I use to establish my connection, and write data to the port.

-(void)connection//:(NSString *)serviceName forIpAddress:(NSString *)ipAddress forPort:(NSString *)portNo
{
    if(input && output)
        [self close];
    NSString *urlString = [NSString stringWithFormat:@"%.%.%.%", "192.168.3.120"];
    NSURL *website = [NSURL URLWithString:urlString];
    if (!website) {
        NSLog(@"%@ is not a valid URL", website);
    }

    CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)[website host], 43, &readStream, &writeStream);
    CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
    CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
    NSInputStream *input = (__bridge NSInputStream *)readStream;
    NSOutputStream *output= (__bridge NSOutputStream *)writeStream;
}



    - (void)open {
    [input setDelegate:self];
    [output setDelegate:self];
    [input scheduleInRunLoop:[NSRunLoop currentRunLoop]
                     forMode:NSDefaultRunLoopMode];
    [output scheduleInRunLoop:[NSRunLoop currentRunLoop]
                      forMode:NSDefaultRunLoopMode]; [input open];
    [output open];
}




-(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
{
    NSString *event;
    switch (streamEvent)
    {
        case NSStreamEventNone:
            event = @"NSStreamEventNone";
            break;
        case NSStreamEventOpenCompleted:
            event = @"NSStreamEventOpenCompleted";
            break;
        case NSStreamEventHasBytesAvailable:
            event = @"NSStreamEventHasBytesAvailable";
            if (theStream == input)
            {
                uint8_t buffer[1024];
                NSInteger len;
                while ([input hasBytesAvailable])
                {
                    len = [input read:buffer maxLength:1024];
                    if (len > 0)
                    {
                            NSMutableString *output = [[NSMutableString alloc]initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];                                                       NSLog(@"Received data--------------------%@", output);
                    }
                }
            }
                                        break;
                                        case NSStreamEventHasSpaceAvailable:
                                        event = @"NSStreamEventHasSpaceAvailable";
                                        break;
                                        case NSStreamEventErrorOccurred:
                                        event = @"NSStreamEventErrorOccurred";
                                        //[self close];
                                        break;
                                        case NSStreamEventEndEncountered:
                                        break; default:
                                        event = @"NSStreamEventEndEncountered";
                                        //[self close];
                                        event = @"Unknown"; break;
    }
    NSLog(@"event------%@",event);
}



- (void)close
{
    [input close];
    [output close];
    [input removeFromRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];
    [output removeFromRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];
    [input setDelegate:nil];
    [output setDelegate:nil];
    input = nil;
    output = nil;
}




- (void)dataSending:(NSString*)data
{
    if(output)
    {
        if(![output hasSpaceAvailable])
            return;
        NSData *_data=[data dataUsingEncoding:NSUTF8StringEncoding];
        NSInteger data_len = [_data length];
        uint8_t *readBytes = (uint8_t *)[_data bytes];
        int byteIndex=0;
        unsigned int len=0;
        while (TRUE)
        {
            len = ((data_len - byteIndex >= 40960) ? 40960 : (data_len-byteIndex));
            if(len==0)
                break;
            uint8_t buf[len];
            (void)memcpy(buf, readBytes, len);
            len = [output write:(const uint8_t *)buf maxLength:len];
            byteIndex += len;
            readBytes += len;
        }
        NSLog(@"Sent data----------------------%@",data);
    }
}

I do call the mentioned functions through that code as a test, and nothing happens

- (IBAction)pumpchange:(id)sender {
    [self connection];
    [self open];

    if ([self.pump backgroundImageForState:(UIControlStateNormal)]==[UIImage imageNamed:@"PumpOff.png"])
    {
        [self.pump setBackgroundImage:[UIImage imageNamed:@"PumpOn.png"] forState:(UIControlStateNormal)];
        [self dataSending:@"pump_on"];
    }

    else //if ([self.pump backgroundImageForState:(UIControlStateNormal)]==[UIImage imageNamed:@"PumpOn.png"])
    {
        [self.pump setBackgroundImage:[UIImage imageNamed:@"PumpOff.png"] forState:(UIControlStateNormal)];
        [self dataSending:@"pump_off"];
    }
    [self close];
}

Thanks in Advance

Upvotes: 0

Views: 294

Answers (1)

Martin R
Martin R

Reputation: 540005

There seem to be some misunderstandings how format strings work, because

NSString *urlString = [NSString stringWithFormat:@"%.%.%.%", "192.168.3.120"];

just gives you the string @"...". Perhaps you meant

NSString *urlString = [NSString stringWithFormat:@"%d.%d.%d.%d", 192, 168, 3, 120];

or

NSString *urlString = [NSString stringWithFormat:@"%s", "192.168.3.120"];

But you don't need a format string at all:

NSString *urlString = @"192.168.3.120";

Upvotes: 3

Related Questions