2009-04-20 29 views
0

データを連続して送受信しているアプリケーションを作成中です。私の最初の送信/受信は正常に実行されていますが、recvfromのサイズが512バイトのデータが必要な場合、戻り値は-1です。これは、「Resource temporarily unavailable」です。 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が返され、外部変数errnoEAGAINに設定されます。

+0

作成するIOスレッドの数に最大限の制限があるのか​​、ネットワークインターフェイスがいっぱいであるのかを知りたいですか? – Neo

+0

貼り付けた内容を読む:「ソケットにメッセージがない場合は、[問題が発生しています。]」 recvfromはあなたが何も受け取ることができないので、-1を返しています。 –

1

UDPアプリケーションを作成していて、同様の問題が発生したと思います。 Peter Hoseyは、与えられた結果がrecvfromであるということは、読み取るべきデータがないことを意味するという点で正しい。しかし、あなたは疑問に思っていた、どのようにデータがないことができますか?

いくつかのホストからあなたのiPhoneに一度にいくつかのUDPデータグラムを送信している場合、そのデータグラムの一部は、(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... 
} 

あなたはあなたのアプリケーションに最適な何を見つけるためにバッファサイズで遊んでする必要があります。

関連する問題