Я писал приложение UDP и думаю, что столкнулся с подобной проблемой. Питер Хоси прав, утверждая, что данный результат recvfrom
означает, что нет данных для чтения; но вам было интересно, откуда не может быть данных?
Если вы отправляете несколько дейтаграмм UDP одновременно с какого-либо хоста на ваш iphone, некоторые из этих дейтаграмм могут быть отброшены, поскольку размер буфера приема (на iphone) недостаточно велик, чтобы вместить столько данных одновременно. 1004 *
Надежный способ решения проблемы - реализовать функцию, которая позволяет вашему приложению запрашивать повторную передачу отсутствующих дейтаграмм. Не столь надежное решение (которое не решает все проблемы, которые делает это надежное решение) состоит в том, чтобы просто увеличить размер буфера приема, используя 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...
}
Возможно, вам придется поэкспериментировать с размером буфера, чтобы найти оптимальный для вашего приложения.