Получение нескольких данных одновременно по UDP - PullRequest
1 голос
/ 20 декабря 2011

Клиент (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 ... Так что я думаю, что есть другой способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...