использование sendto () в iPhone - проблема выделения памяти - PullRequest
0 голосов
/ 26 февраля 2012

Я использовал lib для отправки пакетов RTP. после установления сеанса в сетях низкого качества я получил эту ошибку для большинства отправленных пакетов:

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

1 Ответ

0 голосов
/ 27 февраля 2012

Cannot allocate memory часто встречается при использовании sendto () на iOS, когда в хитрой сети. Я видел это загружается. По сути, вы не можете ничего с этим поделать, если не считать изящного отказа и, возможно, меньше проталкивать в периоды возникновения этой проблемы. Это будет, потому что буферы заполняются внутри сетевой карты.

Что касается рефакторинга - возможно, опубликуйте это на проверке кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...