Я создаю приложение, используя библиотеку 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
Может кто-нибудь объяснить мне, почему мое приложение зависает при попытке чтения из сокета? Заранее спасибо.
У меня не установлен брандмауэр.