//send data ,and save the left data static int __tcpnode_send_with_save(struct nd_tcp_node *node, void *msg_buf, size_t datalen) { ENTER_FUNC() ; int ret = node->sock_write((nd_handle)node,msg_buf,datalen) ; if(-1==ret ) { if(node->sys_error!=ESOCKETTIMEOUT){ LEAVE_FUNC(); return -1 ; } else { ret = ndlbuf_write(&(node->send_buffer),(void*)msg_buf,datalen,EBUF_SPECIFIED) ; if(ret == datalen) { node->myerrno = NDERR_SUCCESS ; } } } else if(ret==datalen) { LEAVE_FUNC(); return (int)datalen ; } else { int wlen ; char *padd = (char*) msg_buf ; padd += ret ; wlen = ndlbuf_write(&(node->send_buffer),padd,datalen-ret,EBUF_SPECIFIED) ; if (wlen > 0) { ret = wlen + ret; } } LEAVE_FUNC(); return ret ; }
static int __tcpnode_push_and_send(struct nd_tcp_node *node, void *msg_buf, size_t datalen, int is_write_all) { ENTER_FUNC(); signed int ret =0; nd_netbuf_t *pbuf = &(node->send_buffer); size_t length_in_buff = ndlbuf_datalen(pbuf); if (length_in_buff) { int flushlen = node->sock_write((nd_handle)node, ndlbuf_data(pbuf), length_in_buff); if (flushlen > 0) { nd_assert(flushlen <= length_in_buff); ndlbuf_sub_data(pbuf, (size_t)flushlen); } length_in_buff = ndlbuf_datalen(pbuf); } if (length_in_buff == 0) { ret = __tcpnode_send_with_save(node, msg_buf, datalen); } else { size_t space_len = ndlbuf_free_capacity(pbuf); if(is_write_all && space_len < datalen) { node->myerrno = NDERR_WOULD_BLOCK; ret = -1; } else { ret = ndlbuf_write(pbuf, (void*)msg_buf, datalen, EBUF_SPECIFIED); } } LEAVE_FUNC(); return ret ; }
void NDHttpRequest::InData(const char *data, int size) { ndlbuf_write(&m_recvBuf, (char*)data, size, 0) ; while (m_parseStat < 3 && ParseData() > 0) { if (_getDataSize() ==0) { break ; } } }