2009-04-20 3 views
0

Я пишу приложение, которое непрерывно отправляет и принимает данные. Моя начальная отправка/получение выполняется успешно, но когда я ожидаю данные размером 512 байт в recvfrom, я получаю его возвращаемое значение как -1, которое «Ресурс временно недоступен». а errno - EAGAIN. Если я использую блокирующий вызов, то есть без тайм-аута, приложение просто зависает в recvfrom. Есть ли максимальный предел для recvfrom на iPhone? Ниже приведена функция, которая получает данные с сервера. Я не могу понять, что может быть не так.iPhone Не удается получить данные с использованием UDP recvfrom

{ struct timeval tv; 

tv.tv_sec = 3; 
tv.tv_usec = 100000; 

    setsockopt (mSock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv); 

    NSLog(@"Receiving.. sock:%d",mSock); 

    recvBuff = (unsigned char *)malloc(1024); 
    if(recvBuff == NULL) 
     NSLog(@"Cannot allocate memory to recvBuff"); 

    fromlen = sizeof(struct sockaddr_in); 
    n = recvfrom(mSock,recvBuff,1024,0,(struct sockaddr *)&from, &fromlen); 

    if (n == -1) { 
     [self error:@"Recv From"]; 
     return; 
    } 
    else 
    { 
     NSLog(@"Recv Addr: %s Recv Port: %d",inet_ntoa(from.sin_addr), ntohs(from.sin_port)); 
     strIPAddr = [[NSString alloc] initWithFormat:@"%s",inet_ntoa(from.sin_addr)]; 
     portNumber = ntohs(from.sin_port); 
     lIPAddr = [KDefine StrIpToLong:strIPAddr]; 
     write(1,recvBuff,n); 
     bcopy(recvBuff, data, n); 
     actualRecvBytes = n; 
     free(recvBuff); 
    } 

}

ответ

1

Read the manpage:

Если сообщений нет на патроне, приема ожидает вызова на сообщение, чтобы прибыть, если сокет не неблокируемый (см fcntl(2)) в в этом случае возвращается значение -1, а внешняя переменная errno установлена ​​в EAGAIN.

+0

Я хочу знать, существует ли какой-либо максимальный предел для количества создаваемых потоков ввода-вывода или могут быть сетевые интерфейсы заполнены? – Neo

+0

Прочтите, что я вставил: «Если в сокете нет сообщений, [проблема возникает]». recvfrom блокирует/возвращает -1, потому что вам нечего получать. –

1

Я писал приложение UDP и думал, что столкнулся с подобной проблемой. Питер Хоузи прав, заявив, что данный результат recvfrom означает, что нет данных для чтения; но вам интересно, как не может быть данных?

Если вы отправляете несколько дейтаграмм UDP за один раз с какого-либо хоста на ваш iphone, некоторые из этих датаграмм могут быть отброшены, потому что размер буфера приема (на iphone) недостаточно велик для одновременного размещения большого количества данных.

Надежный способ устранения проблемы заключается в реализации функции, которая позволяет вашему приложению запрашивать повторную передачу отсутствующих дейтаграмм. Не столь надежное решение (которое не решает все проблемы, которые требуется для надежного решения) просто увеличивает размер буфера приема, используя setsockopt(2).

Регулировка размера буфера может быть сделано следующим образом:

int rcvbuf_size = 128 * 1024; // That's 128Kb of buffer space. 
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, 
     &rcvbuf_size, sizeof(rcvbuf_size)) == -1) { 
    // put your error handling here... 
} 

Вы, возможно, придется играть с размером буфера, чтобы найти то, что оптимальным для вашего приложения.

Смежные вопросы