Чтение из сокета с помощью SmallSockets приводит к сбою приложения - PullRequest
0 голосов
/ 24 октября 2009

Я создаю приложение, используя библиотеку SmallSockets (http://smallsockets.sourceforge.net/).

У меня есть этот код:

#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

и вот что говорит мой отладчик после нажатия кнопки, которая запускает действие doRequest:

2009-10-24 18: 22: 19.197 HTTP iDebug [4836: a0f] Соединение ...
2009-10-24 18: 22: 19.399 HTTP iDebug [4836: a0f] Запись ...
2009-10-24 18: 22: 19.400 HTTP iDebug [4836: a0f] Чтение ...

Имя хоста http://www.example.com
и порт 80

Может кто-нибудь объяснить мне, почему мое приложение зависает при попытке чтения из сокета? Заранее спасибо.

У меня не установлен брандмауэр.

1 Ответ

0 голосов
/ 25 октября 2009

Потому что вы не запускаете цикл обработки событий; вы просто читаете из сокета. Вы не показываете, что такое текст tvRequest, но я предполагаю, что сервер ожидает дальнейшего ввода, пока вы ожидаете вывода из него.

Возможно, с NSURLConnection будет проще работать. Он асинхронный, что облегчает игру с циклом событий, а классы запросов и ответов специально разработаны для упрощения HTTP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...