Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iPhone中使用sendto()-内存分配问题_Iphone - Fatal编程技术网

在iPhone中使用sendto()-内存分配问题

在iPhone中使用sendto()-内存分配问题,iphone,Iphone,我使用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 gprs

我使用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
gprs上的iPhone插座可能有一些特殊问题? 在下面的代码中,我产生了该错误:

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;
}
static int-rtp\u-sendmsg(int-sock、mblk\u t*m、struct-sockaddr*rem\u-addr、int-addr\u-len){
整数误差;
结构msghdr msg;
结构iovec iov[最大iov];
国际奥夫伦;
对于(iovlen=0;iovlenb_cont,iovlen++){
iov[iovlen].iov_base=m->b_rptr;
iov[iovlen].iov_len=m->b_wptr-m->b_rptr;
//ortp_警告(“iovlen大小:%d”,m->b_wptr-m->b_rptr);
}
如果(iovlen==最大值){
ortp_错误(“msgb太长,不适合iov,结束丢弃”);
}
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_标志=0;
错误=sendmsg(sock,&msg,0);
返回误差;
}
任何人都可以建议重构这段代码(我对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;
}
int
rtp_会话\u rtp_发送(rtp会话*会话,mblk_t*m)
{
整数误差;
int i;
rtp_头_t*hdr;
struct sockaddr*destaddr=(struct sockaddr*)和session->rtp.rem\u addr;
socklen\u t destlen=session->rtp.rem\u addrlen;
ortp_socket\u t sockfd=会话->rtp.socket;
hdr=(rtp_头_t*)m->b_rptr;
/*执行主机到网络的转换*/
hdr->ssrc=htonl(hdr->ssrc);
hdr->timestamp=htonl(hdr->timestamp);
hdr->序号=HTON(hdr->序号);
对于(i=0;icc;i++)
hdr->CSC[i]=htonl(hdr->CSC[i]);
if(会话->标志和RTP\U插槽\U连接){
destaddr=NULL;
destlen=0;
}
if(rtp_会话_使用_传输(会话,rtp)){
错误=(session->rtp.tr->t_sendto)(session->rtp.tr,m,0,destaddr,destlen);
//ortp_警告(“rtp_会话_使用_传输通过”);
}否则{
//ortp_警告(“rtp_会话_使用_传输未通过”);
#ifdef使用_SENDMSG
错误=rtp_sendmsg(sockfd、m、destaddr、destlen);
#否则
如果(m->b_cont!=NULL)
msgpullup(m,-1);
错误=sendto(sockfd,(char*)m->b_rptr,(int)(m->b_wptr-m->b_rptr),
0,destaddr,destlen);
#恩迪夫
}
如果(错误<0){
如果(会话->网络错误。计数>0){
rtp_信号_表_emit3(&session->on_network_error,(long)“发送rtp数据包时出错”,INT_TO_指针(getSocketErrorCode());
}else ortp_警告(“发送rtp数据包时出错:%s;套接字=%i”,getSocketError(),sockfd);
会话->rtp.send_errno=getSocketErrorCode();
}否则{
更新发送的字节(会话,错误);
}
freemsg(m);
返回误差;
}

无法分配内存
在iOS上使用sendto()时,在不可靠的网络上经常发生这种情况。我已经看过了。基本上,除了优雅地失败,或者在这个问题发生的时候,你没有什么可以做的。这是因为网卡内的缓冲区已满

至于重构,也许可以在