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

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

问题描述:

我正在为iPad项目工作,它是一个小程序,我需要它与另一个在Windows上运行并且像服务器一样运行的软件进行通信;所以我为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]; 
} 

其实,这个回调被在我的代码调用,问题是,我不知道我怎样才能使Windows客户端发过来的数据,我希望接收的字节数组,但我不知道如何从数据参数中获取这些字节。

如果有人可以帮助我找到一个方法来做到这一点,也许我点我另一种方式来从服务器获取数据在我的客户端应用程序,我真的很感激。

谢谢。

在您的回调中,data参数确实为kCFSocketDataCallBack回调类型的CFDataRef值。

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

array将包含字节数组。