2012-02-26 26 views
0

我正在使用lib發送RTP數據包。建立會話之後,對質量差的網絡我收到此錯誤的大多數數據包,這是派:在iPhone中使用sendto() - 內存分配問題

2012-02-26 05:15:53.947[492:7c3b] iovlen size:12 
2012-02-26 05:15:53.950[492:7c3b] iovlen size:160 
2012-02-26 05:15:53.955[492:7c3b] Error sending rtp packet: Cannot allocate memory ; socket=26 

大概插座iPhone上GPRS有一些具體的問題? 在波紋管的代碼,我產生一個錯誤:

static int rtp_sendmsg(int sock,mblk_t *m, struct sockaddr *rem_addr, int addr_len){ 
    int error; 
    struct msghdr msg; 
    struct iovec iov[MAX_IOV]; 
    int iovlen; 
    for(iovlen=0; iovlen<MAX_IOV && m!=NULL; m=m->b_cont,iovlen++){ 
     iov[iovlen].iov_base=m->b_rptr; 
     iov[iovlen].iov_len=m->b_wptr-m->b_rptr; 
     //ortp_warning ("iovlen size:%d",m->b_wptr-m->b_rptr); 
    } 
    if (iovlen==MAX_IOV){ 
     ortp_error("Too long msgb, didn't fit into iov, end discarded."); 
    } 
    msg.msg_name=(void*)rem_addr; 
    msg.msg_namelen=addr_len; 
    msg.msg_iov=&iov[0]; 
    msg.msg_iovlen=iovlen; 
    msg.msg_control=NULL; 
    msg.msg_controllen=0; 
    msg.msg_flags=0; 
    error=sendmsg(sock,&msg,0); 
    return error; 
} 

任何人都可以提出來重構這個代碼(我不是在C非常強,所以讚賞的代碼最終和平),這個功能是從,這部分被稱爲代碼:

int 
rtp_session_rtp_send (RtpSession * session, mblk_t * m) 
{ 
    int error; 
    int i; 
    rtp_header_t *hdr; 
    struct sockaddr *destaddr=(struct sockaddr*)&session->rtp.rem_addr; 
    socklen_t destlen=session->rtp.rem_addrlen; 
    ortp_socket_t sockfd=session->rtp.socket; 

    hdr = (rtp_header_t *) m->b_rptr; 
    /* perform host to network conversions */ 
    hdr->ssrc = htonl (hdr->ssrc); 
    hdr->timestamp = htonl (hdr->timestamp); 
    hdr->seq_number = htons (hdr->seq_number); 
    for (i = 0; i < hdr->cc; i++) 
     hdr->csrc[i] = htonl (hdr->csrc[i]); 

    if (session->flags & RTP_SOCKET_CONNECTED) { 
     destaddr=NULL; 
     destlen=0; 
    } 

    if (rtp_session_using_transport(session, rtp)){ 
     error = (session->rtp.tr->t_sendto) (session->rtp.tr,m,0,destaddr,destlen); 
     //ortp_warning ("rtp_session_using_transport passed"); 
    }else{ 
     //ortp_warning ("rtp_session_using_transport NOT passed"); 

#ifdef USE_SENDMSG 
     error=rtp_sendmsg(sockfd,m,destaddr,destlen); 
#else 
     if (m->b_cont!=NULL) 
      msgpullup(m,-1); 
     error = sendto (sockfd, (char*)m->b_rptr, (int) (m->b_wptr - m->b_rptr), 
      0,destaddr,destlen); 
#endif 
    } 
    if (error < 0){ 
     if (session->on_network_error.count>0){ 
      rtp_signal_table_emit3(&session->on_network_error,(long)"Error sending RTP packet",INT_TO_POINTER(getSocketErrorCode())); 
     }else ortp_warning ("Error sending rtp packet: %s ; socket=%i", getSocketError(), sockfd); 
     session->rtp.send_errno=getSocketErrorCode(); 
    }else{ 
     update_sent_bytes(session,error); 
    } 
    freemsg (m); 
    return error; 
} 

回答

0

Cannot allocate memory狡猾的網絡上使用時在iOS SENDTO()時,會發生很多。我看到它加載。基本上,除了優雅的失敗之外,你可以做的事情並不多,而且在發生這個問題的時候可能會減少。這將是因爲緩衝區填滿了網卡。

至於重構 - 或許發佈在code review.