通过UDP一次获取多个数据

时间:2011-12-20 02:39:51

标签: objective-c ios sockets udp

客户端(iOS)发送消息,服务器检查并回答。 iOS显示答案。

有两种类型的答案。一个只是一个答案。服务器只发送一次。 另一个有点不同。服务器发送20次。

当服务器发送一次时,我可以很好地处理。这并不难。

问题在于第二种类型:

我尝试了两种获取数据的方法。 首先,我使用了一个简单的CFSocket示例并进行了一些修改。当它收到消息时,它运行良好。当它收到20条消息时,它会因错误而停止。它说“节目收到信号'SIGABRT'”

//主要代码

CFSocketRef ref = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_DGRAM, 0, kCFSocketReadCallBack|kCFSocketDataCallBack|kCFSocketConnectCallBack|kCFSocketWriteCallBack, CFSockCallBack, NULL); 

struct sockaddr_in theName; 
struct hostent *hp; 

theName.sin_port = htons(5003); 
theName.sin_family = AF_INET; 

hp = gethostbyname(IPADDRESS); 
if( hp == NULL ) { 
    return; 
} 
memcpy( &theName.sin_addr.s_addr, hp->h_addr_list[PORT_NUM], hp->h_length );

CFDataRef addressData = CFDataCreate( NULL, &theName, sizeof( struct sockaddr_in ) );

CFSocketConnectToAddress(ref, addressData, 30);

CFRunLoopSourceRef FrameRunLoopSource = CFSocketCreateRunLoopSource(NULL, ref , 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), FrameRunLoopSource, kCFRunLoopCommonModes); 

//回调方法

void CFSockCallBack ( 
                 CFSocketRef s, 
                 CFSocketCallBackType callbackType, 
                 CFDataRef address, 
                 const void *data, 
                 void *info 
                 ) { 

NSLog(@"callback!"); 
if(callbackType == kCFSocketDataCallBack) { 
    [lock lock];

    NSLog(@"has data"); 
    UInt8 * d = CFDataGetBytePtr((CFDataRef)data); 
    int len = CFDataGetLength((CFDataRef)data); 
    for(int i=0; i < len; i++) { 
      //  NSLog(@"%c",*(d+i)); 
    } 

    //Data processing area=

    [lock unlock];
} 
if(callbackType == kCFSocketReadCallBack) { 
    NSLog(@"to read"); 
    char buf[100] = {0}; 
    int sock = CFSocketGetNative(s); 
    NSLog(@"to read"); 
    NSLog(@"read:%d",recv(sock, &buf, 100, 0)); 
    NSLog(@"%s",buf); 
} 
if(callbackType == kCFSocketWriteCallBack) { 
    NSLog(@"to write"); 
    char sendbuf[100]={0x53, 0x4D, 0x49, 0x43, 0x2}; 
    //strcpy(sendbuf,"GET / HTTP/1.0\r\n\r\n"); 
    //NSLog(@"%c",0x53);
    CFDataRef dt = CFDataCreate(NULL, sendbuf, 5); 
    CFSocketSendData(s, NULL, dt, strlen(sendbuf)); 
} 
if(callbackType == kCFSocketConnectCallBack) { 
    NSLog(@"connected"); 
} 

}

第二种方法是使用CocoaAsyncSocket。它似乎运作良好。但有时它会因错误而停止 我用了GCDAsyncUDPSocket。它随信号“EXC_BAD_ACCESS”随机停止。

我在Android上做得很好......所以我认为还有其他方法可行。

0 个答案:

没有答案