iOS - Как мне создать поток чтения и записи в сетевой сокет? - PullRequest
1 голос
/ 28 февраля 2011

Я новичок в разработке для iOS.Я пытаюсь создать поток для чтения и записи.Я использую примеры из руководства по программированию CFNetworking, чтобы попытаться заставить что-то работать.

Я пытаюсь запланировать поток чтения в цикле выполнения, чтобы обойти проблему блокировки потоков.Я сразу столкнулся с проблемами.Как я могу создать объект CFHost, используя CFHhostCreateWithAddress?Вот что у меня пока так:

NSString *address = @"irc.ubuntu.net";
CFDataRef addressDataRef = (CFDataRef)[address dataUsingEncoding:NSASCIIStringEncoding];

CFHostRef host = CFHostCreateWithAddress(kCFAllocatorDefault, addressDataRef);

//Create Read and Write Stream
CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, host, 8008, &readStream, &writeStream);

Бомбы второй линии.Может кто-нибудь сказать, пожалуйста, как создать CFHostRef?

Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 28 февраля 2011

Документация гласит, что вторым аргументом CFHostCreateWithAddress () должен быть "объект CFDataRef, содержащий структуру sockaddr для адреса хоста. Это значение не должно быть NULL."

Вы передаете CFDataRef, представляющий "irc.ubuntu.net", который ни в коем случае не является структурой sockaddr.

Используйте CFHostCreateWithName:

CFHostRef CFHostCreateWithName (
   CFAllocatorRef allocator,
   CFStringRef hostname
);

Как вы, вероятно, знаете, вы можетеприведите NSString * к CFStringRef или создайте константу CFStringRef с макросом CFSTR ().

0 голосов
/ 09 августа 2011
+ (NSData *)dataForIPAddress:(NSString *)address {
  struct addrinfo hints;
  struct addrinfo *result = NULL;
  memset(&hints, 0, sizeof(hints));
  hints.ai_flags = AI_NUMERICHOST;
  hints.ai_family = PF_UNSPEC;
  hints.ai_socktype = SOCK_STREAM;
  hints.ai_protocol = 0;
  int errorStatus = getaddrinfo([address cStringUsingEncoding:NSASCIIStringEncoding], NULL, &hints, &result);
  if (errorStatus != 0) return nil;
  CFDataRef addressRef = CFDataCreate(NULL, (UInt8 *)result->ai_addr, result->ai_addrlen);
  if (addressRef == nil) return nil;
  freeaddrinfo(result);
  return [(NSData *)addressRef autorelease];
}
...