2010-06-17 1 views
2

Я работаю над проектом для iPad, это небольшая программа, и мне нужно, чтобы она общалась с другим программным обеспечением, которое работает на окнах и действует как сервер; поэтому приложение, которое я создаю для iPad, будет клиентом.Как использовать CFNetwork для получения массива байтов из сокетов?

Я использую CFNetwork делать сокеты связи, это способ, которым я установить соединение:

char ip[] = "192.168.0.244"; 
NSString *ipAddress = [[NSString alloc] initWithCString:ip]; 

/* Build our socket context; this ties an instance of self to the socket */ 
CFSocketContext CTX = { 0, self, NULL, NULL, NULL }; 

/* Create the server socket as a TCP IPv4 socket and set a callback */ 
/* for calls to the socket's lower-level connect() function */ 
TCPClient = CFSocketCreate(NULL, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketDataCallBack, (CFSocketCallBack)ConnectCallBack, &CTX); 

if (TCPClient == NULL) 
    return; 

/* Set the port and address we want to listen on */ 
struct sockaddr_in addr; 
memset(&addr, 0, sizeof(addr)); 
addr.sin_len = sizeof(addr); 
addr.sin_family = AF_INET; 
addr.sin_port = htons(PORT); 
addr.sin_addr.s_addr = inet_addr([ipAddress UTF8String]); 

CFDataRef connectAddr = CFDataCreate(NULL, (unsigned char *)&addr, sizeof(addr)); 
CFSocketConnectToAddress(TCPClient, connectAddr, -1); 
CFRunLoopSourceRef sourceRef = CFSocketCreateRunLoopSource(kCFAllocatorDefault, TCPClient, 0); 
CFRunLoopAddSource(CFRunLoopGetCurrent(), sourceRef, kCFRunLoopCommonModes); 
CFRelease(sourceRef); 
CFRunLoopRun(); 

И это, как я отправил данные, которые в основном представляет собой массив байтов

/* The native socket, used for various operations */ 
// TCPClient is a CFSocketRef member variable 
CFSocketNativeHandle sock = CFSocketGetNative(TCPClient); 

Byte byteData[3]; 
byteData[0] = 0; 
byteData[1] = 4; 
byteData[2] = 0; 

send(sock, byteData, strlen(byteData)+1, 0); 

Наконец, как вы, возможно, заметили, когда я создаю серверный сокет, я зарегистрировал обратный вызов для типа kCFSocketDataCallBack, это код.

void ConnectCallBack(CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) 
{ 
    // SocketsViewController is the class that contains all the methods 
    SocketsViewController *obj = (SocketsViewController*)info; 

    UInt8 *unsignedData = (UInt8 *) CFDataGetBytePtr(data); 

    char *value = (char*)unsignedData; 
    NSString *text = [[NSString alloc]initWithCString:value length:strlen(value)]; 
    [obj writeToTextView:text]; 
    [text release]; 
} 

На самом деле, этот обратный вызов быть вызван в моем коде, проблема в том, что я не знаю, как я могу получить данные о том, что клиент окна послал меня, я ожидал получить массив байтов , но я не знаю, как я могу получить эти байты из параметра param.

Если кто-нибудь может помочь мне найти способ сделать это, или, может быть, я укажу мне другой способ получить данные с сервера в моем клиентском приложении, я был бы очень признателен.

Спасибо.

ответ

1

В своем обратном вызове параметр data действительно является значением CFDataRef для типа обратного вызова kCFSocketDataCallBack.

CFDataRef dataRef = (CFDataRef) data; 
Byte *array = new Byte[CFDataGetLength(dataRef)]; // Or use a fixed length 
CFDataGetBytes(dataRef, CFRangeMake(0, CFDataGetLength(theData)), array); 

array будет содержать массив байтов.