2009-04-20 4 views
0

Ich schreibe eine Anwendung, die kontinuierlich Daten sendet und empfängt. Mein anfänglicher Sende-/Empfangsvorgang wird erfolgreich ausgeführt, aber wenn ich Daten mit der Größe 512 Bytes im recvfrom erwarte, bekomme ich den Rückgabewert als -1, was "Ressource vorübergehend nicht verfügbar" ist. und errno wird auf EAGAIN gesetzt. Wenn ich einen blockierenden Anruf verwende, d. H. Ohne Timeout, hängt die Anwendung einfach in recvfrom. Gibt es eine maximale Beschränkung für recvfrom auf dem iPhone? Unten ist die Funktion, die Daten vom Server empfängt. Ich kann nicht herausfinden, was schief gehen kann.iPhone Kann keine Daten empfangen mit 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); 
    } 

}

Antwort

1

lesen the manpage:

Wenn keine Nachrichten an der Steckdose zur Verfügung stehen, wird der Anruf wartet erhalten für eine Meldung zu gelangen, es sei denn, die Buchse (siehe fcntl(2)) blockiert nicht in In diesem Fall wird der Wert -1 zurückgegeben und die externe Variable errno auf EAGAIN gesetzt.

+0

Ich möchte wissen, ob gibt es eine maximale Grenze für die Anzahl der IO-Threads erstellt werden oder möglicherweise die Netzwerkschnittstellen sind voll? – Neo

+0

Lesen Sie, was ich eingefügt habe: "Wenn keine Nachrichten am Socket verfügbar sind, [Problem Sie]]. recvfrom blockiert/gibt -1 zurück, weil Sie nichts erhalten können. –

1

Ich schrieb eine UDP-Anwendung und denke, dass ich auf ein ähnliches Problem stieß. Peter Hosey hat richtigerweise festgestellt, dass das gegebene Ergebnis recvfrom bedeutet, dass keine Daten zu lesen sind; Aber Sie haben sich gefragt, wie kann es keine Daten geben?

Wenn Sie mehrere UDP-Datagramme gleichzeitig von einem Host zu Ihrem iphone senden, können einige dieser Datagramme verworfen werden, da die Empfangspuffergröße (auf dem iphone) nicht groß genug ist, um so viele Daten gleichzeitig aufzunehmen.

Der robuste Weg zur Behebung des Problems besteht darin, eine Funktion zu implementieren, mit der Ihre Anwendung eine erneute Übertragung fehlender Datagramme anfordern kann. Eine nicht so robuste Lösung (die nicht alle Probleme löst, die die robuste Lösung darstellt) besteht darin, einfach die Empfangspuffergröße unter Verwendung von setsockopt(2) zu erhöhen.

Die Einstellung Puffergröße kann wie folgt erfolgen:

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... 
} 

Sie müssen um mit Puffergröße spielen zu finden, was für Ihre Anwendung optimal ist.

Verwandte Themen