Objective c 如何使用CFNetwork从套接字获取字节数组?

Objective c 如何使用CFNetwork从套接字获取字节数组?,objective-c,iphone,sockets,winsock,Objective C,Iphone,Sockets,Winsock,我正在为iPad做一个项目,它是一个小程序,我需要它与另一个运行在windows上的软件进行通信,就像服务器一样;因此,我为iPad创建的应用程序将是客户端 我使用CFNetwork进行套接字通信,这是我建立连接的方式: char ip[] = "192.168.0.244"; NSString *ipAddress = [[NSString alloc] initWithCString:ip]; /* Build our socket context; this ties an instan

我正在为iPad做一个项目,它是一个小程序,我需要它与另一个运行在windows上的软件进行通信,就像服务器一样;因此,我为iPad创建的应用程序将是客户端

我使用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]; 
}
实际上,在我的代码中调用了此回调,问题是我不知道如何获取windows客户端发送给我的数据,我希望接收一个字节数组,但我不知道如何从数据参数获取这些字节

如果有人能帮我找到一种方法来实现这一点,或者我可以告诉我另一种方法来从我的客户机应用程序中的服务器获取数据,我将非常感激


谢谢。

在回调中,
数据
参数确实是
CFDataRef
回调类型的值

CFDataRef dataRef = (CFDataRef) data;
Byte *array = new Byte[CFDataGetLength(dataRef)]; // Or use a fixed length
CFDataGetBytes(dataRef, CFRangeMake(0, CFDataGetLength(theData)), array);
数组将包含字节数组