views:

84

answers:

1

Hi,

I'm creating an app using the SmallSockets library ( http://smallsockets.sourceforge.net/ ).

I have this code:

#import "MAController.h"
#import "Socket.h"


@implementation MAController

- (IBAction)doRequest:(id)sender
{
    //Initialize
    NSURL      *uUrl  = [[NSURL alloc] initWithString:[tfHost stringValue]];
    int         iPort = [[uUrl port] intValue];
    NSString   *sHost = [uUrl host];

    //Check
    if(sHost == NULL)
    {
     //Invalid Host name
     NSLog(@"Invalid Host name");
     NSAlert *aInvalidHost = [[[NSAlert alloc] init] autorelease];
     [aInvalidHost addButtonWithTitle:@"Ok"];
     [aInvalidHost setInformativeText:@"Invalid Host name"];
     [aInvalidHost setMessageText:@"You have entered an invalid host name. Please enter a valid host name."];
     [aInvalidHost setAlertStyle:NSInformationalAlertStyle];
     [aInvalidHost beginSheetModalForWindow:wMain modalDelegate:self didEndSelector:NULL contextInfo:nil];
     return;
    }
    if(iPort == 0)
    {
     iPort = 80;
    }

    //Create request
    NSString *sRequest = [[NSString alloc] initWithString:[tvRequest string]];

    //Create socket
    Socket *sSocket = [Socket socket];

    NSLog(@"Connecting...");
    [sSocket connectToHostName:sHost port:iPort];

    //Write request
    NSLog(@"Writing...");
    [sSocket writeString:sRequest];

    //Read response
    NSLog(@"Reading...");
    NSMutableData *mdResponse = [[[NSMutableData alloc] init] autorelease];

//IT CRASHES RIGHT HERE
    while([sSocket readData:mdResponse])
    {
     NSLog(@"Read.");
    }

    //Display response
    NSLog(@"Displaying...");
    NSString *sResponse = [[[NSString alloc] initWithData:mdResponse
                  encoding:[NSString defaultCStringEncoding]]
                              autorelease];
    [tvResponse setString:sResponse];

    [mdResponse release];
    [sSocket release];
}

@end

and here is what my debugger says after I click the button which fires the doRequest action:

2009-10-24 18:22:19.197 iDebug HTTP[4836:a0f] Connecting...
2009-10-24 18:22:19.399 iDebug HTTP[4836:a0f] Writing...
2009-10-24 18:22:19.400 iDebug HTTP[4836:a0f] Reading...

Hostname is http://www.example.com
and port is 80

can anyone explain me why my app hangs while its trying to read fromt the socket? Thanks in advance.

I have no firewall installed.

A: 

Because you're not running the event loop; you're just reading from a socket. You don't show what the text of tvRequest is, but my guess is that the server is waiting for further input while you're waiting for output from it.

You may find NSURLConnection easier to work with. It's asynchronous, which makes playing nice with the event loop easier, and the request and response classes are designed specifically to make HTTP easy.

Peter Hosey