2009-04-20 71 views
0

我正在寫一個連續發送和接收數據的應用程序。我的初始發送/接收正在成功運行,但是當我預計recvfrom中的數據大小爲512字節時,我的返回值爲-1,即「資源暫時不可用」。並將errno設置爲EAGAIN。如果我使用阻塞呼叫,即沒有超時,則應用程序只會掛在recvfrom中。 iPhone上的recvfrom有沒有最大限制?以下是從服務器接收數據的功能。我無法弄清楚會出現什麼問題。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

閱讀the manpage

如果沒有消息可在插座,接收呼叫等待消息的到達,除非套接字非阻塞(見fcntl(2))在在這種情況下,返回值-1並將外部變量errno設置爲EAGAIN

+0

我想知道是否有任何創建IO線程的最大限制或可能是網絡接口已滿? – Neo 2009-04-20 11:40:52

1

我正在寫一個UDP應用程序,並認爲我遇到了類似的問題。 Peter Hosey在說明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... 
} 

您可能必須與緩衝區面積約爲發揮找到什麼是最適合你的應用程序:

緩存大小調整可以如下完成。