本文整理汇总了C++中pbuf_copy_partial函数的典型用法代码示例。如果您正苦于以下问题:C++ pbuf_copy_partial函数的具体用法?C++ pbuf_copy_partial怎么用?C++ pbuf_copy_partial使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了pbuf_copy_partial函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: START_TEST
END_TEST
START_TEST(test_pbuf_queueing_bigger_than_64k)
{
int i;
err_t err;
struct pbuf *p1, *p2, *p3, *rest2=NULL, *rest3=NULL;
LWIP_UNUSED_ARG(_i);
for(i = 0; i < TESTBUFSIZE_1; i++) {
testbuf_1[i] = (u8_t)rand();
}
for(i = 0; i < TESTBUFSIZE_2; i++) {
testbuf_2[i] = (u8_t)rand();
}
for(i = 0; i < TESTBUFSIZE_3; i++) {
testbuf_3[i] = (u8_t)rand();
}
p1 = pbuf_alloc(PBUF_RAW, TESTBUFSIZE_1, PBUF_POOL);
fail_unless(p1 != NULL);
p2 = pbuf_alloc(PBUF_RAW, TESTBUFSIZE_2, PBUF_POOL);
fail_unless(p2 != NULL);
p3 = pbuf_alloc(PBUF_RAW, TESTBUFSIZE_3, PBUF_POOL);
fail_unless(p3 != NULL);
err = pbuf_take(p1, testbuf_1, TESTBUFSIZE_1);
fail_unless(err == ERR_OK);
err = pbuf_take(p2, testbuf_2, TESTBUFSIZE_2);
fail_unless(err == ERR_OK);
err = pbuf_take(p3, testbuf_3, TESTBUFSIZE_3);
fail_unless(err == ERR_OK);
pbuf_cat(p1, p2);
pbuf_cat(p1, p3);
pbuf_split_64k(p1, &rest2);
fail_unless(p1->tot_len == TESTBUFSIZE_1);
fail_unless(rest2->tot_len == (u16_t)((TESTBUFSIZE_2+TESTBUFSIZE_3) & 0xFFFF));
pbuf_split_64k(rest2, &rest3);
fail_unless(rest2->tot_len == TESTBUFSIZE_2);
fail_unless(rest3->tot_len == TESTBUFSIZE_3);
pbuf_copy_partial(p1, testbuf_1a, TESTBUFSIZE_1, 0);
pbuf_copy_partial(rest2, testbuf_2a, TESTBUFSIZE_2, 0);
pbuf_copy_partial(rest3, testbuf_3a, TESTBUFSIZE_3, 0);
for(i = 0; i < TESTBUFSIZE_1; i++)
fail_unless(testbuf_1[i] == testbuf_1a[i]);
for(i = 0; i < TESTBUFSIZE_2; i++)
fail_unless(testbuf_2[i] == testbuf_2a[i]);
for(i = 0; i < TESTBUFSIZE_3; i++)
fail_unless(testbuf_3[i] == testbuf_3a[i]);
pbuf_free(p1);
pbuf_free(rest2);
pbuf_free(rest3);
}
示例2: insert_pBuf
void insert_pBuf(struct pbuf* q, uint8_t sock, void* _pcb)
{
if (q == NULL)
return;
if (pBufStore[headBuf][sock].data != NULL)
{
WARN("Overwriting buffer %p idx:%d!\n", pBufStore[headBuf][sock].data, headBuf);
// to avoid memory leak free the oldest buffer
freetDataIdx(headBuf, sock);
}
u8_t* p = (u8_t*)calloc(q->tot_len,sizeof(u8_t));
if(p != NULL) {
if (pbuf_copy_partial(q, p, q->tot_len,0) != q->tot_len) {
WARN("pbuf_copy_partial failed: src:%p, dst:%p, len:%d\n", q, p, q->tot_len);
free(p);
p = NULL;
return;
}
pBufStore[headBuf][sock].data = p;
pBufStore[headBuf][sock].len = q->tot_len;
pBufStore[headBuf][sock].idx = 0;
pBufStore[headBuf][sock].pcb = _pcb;
headBuf++;
if (headBuf == MAX_PBUF_STORED)
headBuf = 0;
if (headBuf == tailBuf)
WARN("Overwriting data [%d-%d]!\n", headBuf, tailBuf);
INFO_UTIL("Insert: %p:%d-%d [%d,%d]\n", p, q->tot_len, p[0], headBuf, tailBuf);
}
}
示例3: ssl_socket_recv
int ssl_socket_recv(void *ctx, unsigned char *buf, size_t len) {
struct mg_connection *nc = (struct mg_connection *) ctx;
struct mg_lwip_conn_state *cs = (struct mg_lwip_conn_state *) nc->sock;
struct pbuf *seg = cs->rx_chain;
if (seg == NULL) {
DBG(("%u - nothing to read", len));
return MBEDTLS_ERR_SSL_WANT_READ;
}
size_t seg_len = (seg->len - cs->rx_offset);
DBG(("%u %u %u %u", len, cs->rx_chain->len, seg_len, cs->rx_chain->tot_len));
mgos_lock();
len = MIN(len, seg_len);
pbuf_copy_partial(seg, buf, len, cs->rx_offset);
cs->rx_offset += len;
/* TCP PCB may be NULL if connection has already been closed
* but we still have data to deliver to SSL. */
if (cs->pcb.tcp != NULL) tcp_recved(cs->pcb.tcp, len);
if (cs->rx_offset == cs->rx_chain->len) {
cs->rx_chain = pbuf_dechain(cs->rx_chain);
pbuf_free(seg);
cs->rx_offset = 0;
}
mgos_unlock();
LOG(LL_DEBUG, ("%p <- %d", nc, (int) len));
return len;
}
示例4: caml_tcp_read
/* Copy out all the pbufs in a chain into a string, and ack/free pbuf.
* @return 0: nothing, -1: closed connection, +n: bytes read
*/
CAMLprim value
caml_tcp_read(value v_tw)
{
CAMLparam1(v_tw);
CAMLlocal1(v_str);
/* Not using tcp_wrap_of_value as we need to clear out the remaining
RX queue before raising the Connection_closed exception. Check that
tw->pcb is set for the rest of the function before using it. */
tcp_wrap *tw = Tcp_wrap_val(v_tw);
struct pbuf_list *pl = tw->desc->rx;
unsigned int tot_len;
char *s;
LWIP_STUB_DPRINTF("caml_tcp_rx_read");
if (!pl) {
v_str = caml_alloc_string(0);
CAMLreturn(v_str);
}
tot_len = pbuf_list_length(pl);
v_str = caml_alloc_string(tot_len);
s = String_val(v_str);
do {
pbuf_copy_partial(pl->p, s, pl->p->tot_len, 0);
s += pl->p->tot_len;
} while ((pl = pl->next));
if (tw->pcb)
tcp_recved(tw->pcb, tot_len);
pbuf_list_free(tw->desc->rx);
tw->desc->rx = NULL;
CAMLreturn(v_str);
}
示例5: ol_tcp_animate
void ol_tcp_animate(outlet_t *new_ol, struct tcp_pcb *pcb, struct pbuf *ante)
{
//
// lwIP tries hard to allocate a new PCB. If there is not enough memory it
// first kills TIME-WAIT connections and then active connections. The
// error_cb callback is used along the way. The callback may sent an exit
// signal to an outlet and the chain of exit signal may reach the current
// outlet. To avoid this the priority of all PCBs is set to TCP_PRIO_MAX+1.
//
tcp_setprio(pcb, TCP_PRIO_MAX +1);
tcp_arg(pcb, new_ol); // callback arg
tcp_recv(pcb, recv_cb);
tcp_sent(pcb, sent_cb);
tcp_err(pcb, error_cb);
new_ol->tcp = pcb;
if (ante != 0) // data receive while enqueued
{
uint16_t len = ante->tot_len;
if (len > new_ol->recv_bufsize)
{
debug("ol_tcp_animate: tot_len=%d, recv_bufsize=%d, truncating\n",
ante->tot_len, new_ol->recv_bufsize);
len = new_ol->recv_bufsize;
}
pbuf_copy_partial(ante, new_ol->recv_buffer, len, 0);
new_ol->recv_buf_off = len;
pbuf_free(ante);
}
}
示例6: pbuf_copy_partial
err_t TcpClient::onReceive(pbuf *buf)
{
if (buf == NULL)
{
// Disconnected, close it
TcpConnection::onReceive(buf);
}
else
{
if (receive)
{
char* data = new char[buf->tot_len + 1];
pbuf_copy_partial(buf, data, buf->tot_len, 0);
data[buf->tot_len] = '\0';
if (!receive(*this, data, buf->tot_len))
{
delete[] data;
return ERR_MEM;
}
delete[] data;
}
// Fire ReadyToSend callback
TcpConnection::onReceive(buf);
}
return ERR_OK;
}
示例7: http_wait_headers
/** Wait for all headers to be received, return its length and content-length (if available) */
static err_t
http_wait_headers(struct pbuf *p, u32_t *content_length, u16_t *total_header_len)
{
u16_t end1 = pbuf_memfind(p, "\r\n\r\n", 4, 0);
if (end1 < (0xFFFF - 2)) {
/* all headers received */
/* check if we have a content length (@todo: case insensitive?) */
u16_t content_len_hdr;
*content_length = HTTPC_CONTENT_LEN_INVALID;
*total_header_len = end1 + 4;
content_len_hdr = pbuf_memfind(p, "Content-Length: ", 16, 0);
if (content_len_hdr != 0xFFFF) {
u16_t content_len_line_end = pbuf_memfind(p, "\r\n", 2, content_len_hdr);
if (content_len_line_end != 0xFFFF) {
char content_len_num[16];
u16_t content_len_num_len = (u16_t)(content_len_line_end - content_len_hdr - 16);
memset(content_len_num, 0, sizeof(content_len_num));
if (pbuf_copy_partial(p, content_len_num, content_len_num_len, content_len_hdr + 16) == content_len_num_len) {
int len = atoi(content_len_num);
if ((len >= 0) && ((u32_t)len < HTTPC_CONTENT_LEN_INVALID)) {
*content_length = (u32_t)len;
}
}
}
}
return ERR_OK;
}
return ERR_VAL;
}
示例8: mg_lwip_tcp_recv_cb
static err_t mg_lwip_tcp_recv_cb(void *arg, struct tcp_pcb *tpcb,
struct pbuf *p, err_t err) {
struct mg_connection *nc = (struct mg_connection *) arg;
char *data;
size_t len = (p != NULL ? p->len : 0);
DBG(("%p %u %d", nc, len, err));
if (nc == NULL) {
tcp_abort(tpcb);
return ERR_ARG;
}
if (p == NULL) {
system_os_post(MG_TASK_PRIORITY, MG_SIG_CLOSE_CONN, (uint32_t) nc);
return ERR_OK;
}
data = (char *) malloc(len);
if (data == NULL) {
DBG(("OOM"));
return ERR_MEM;
}
pbuf_copy_partial(p, data, len, 0);
pbuf_free(p);
mg_if_recv_tcp_cb(nc, data, len);
if (nc->send_mbuf.len > 0) {
mg_lwip_mgr_schedule_poll(nc->mgr);
}
return ERR_OK;
}
示例9: pbuf_copy_partial
char* NetUtils::pbufAllocateStrCopy(pbuf *buf, int startPos, int length)
{
char* stringPtr = new char[length + 1];
stringPtr[length] = '\0';
pbuf_copy_partial(buf, stringPtr, length, startPos);
return stringPtr;
}
示例10: pbuf_get_at
void NtpClient::onReceive(pbuf *buf, IPAddress remoteIP, uint16_t remotePort)
{
// We do some basic check to see if it really is a ntp packet we receive.
// NTP version should be set to same as we used to send, NTP_VERSION
// Mode should be set to NTP_MODE_SERVER
if (onCompleted != NULL)
{
uint8_t versionMode = pbuf_get_at(buf, 0);
uint8_t ver = (versionMode & 0b00111000) >> 3;
uint8_t mode = (versionMode & 0x07);
if (mode == NTP_MODE_SERVER && ver == NTP_VERSION)
{
//Most likely a correct NTP packet received.
uint8_t data[4];
pbuf_copy_partial(buf, data, 4, 40); // Copy only timestamp.
uint32_t timestamp = (data[0] << 24 | data[1] << 16 | data[2] << 8
| data[3]);
// Unix time starts on Jan 1 1970, subtract 70 years:
uint32_t epoch = timestamp - 0x83AA7E80;
this->onCompleted(*this, epoch);
}
}
示例11: pbuf_get_at
void NtpClient::onReceive(pbuf *buf, IPAddress remoteIP, uint16_t remotePort)
{
// We do some basic check to see if it really is a ntp packet we receive.
// NTP version should be set to same as we used to send, NTP_VERSION
// NTP_VERSION 3 has time in same location so accept that too
// Mode should be set to NTP_MODE_SERVER
uint8_t versionMode = pbuf_get_at(buf, 0);
uint8_t ver = (versionMode & 0b00111000) >> 3;
uint8_t mode = (versionMode & 0x07);
if (mode == NTP_MODE_SERVER && (ver == NTP_VERSION || ver == (NTP_VERSION -1)))
{
//Most likely a correct NTP packet received.
uint8_t data[4];
pbuf_copy_partial(buf, data, 4, 40); // Copy only timestamp.
uint32_t timestamp = (data[0] << 24 | data[1] << 16 | data[2] << 8
| data[3]);
// Unix time starts on Jan 1 1970, subtract 70 years:
uint32_t epoch = timestamp - 0x83AA7E80;
if (autoUpdateSystemClock)
{
SystemClock.setTime(epoch, eTZ_UTC); // update systemclock utc value
}
if (delegateCompleted)
{
this->delegateCompleted(*this, epoch);
}
}
}
示例12: lwip_udp_receive
// Helper function for recv/recvfrom to handle UDP packets
STATIC mp_uint_t lwip_udp_receive(lwip_socket_obj_t *socket, byte *buf, mp_uint_t len, byte *ip, mp_uint_t *port, int *_errno) {
if (socket->incoming == NULL) {
if (socket->timeout != -1) {
for (mp_uint_t retries = socket->timeout / 100; retries--;) {
mp_hal_delay_ms(100);
if (socket->incoming != NULL) break;
}
if (socket->incoming == NULL) {
*_errno = ETIMEDOUT;
return -1;
}
} else {
while (socket->incoming == NULL) {
mp_hal_delay_ms(100);
}
}
}
if (ip != NULL) {
memcpy(ip, &socket->peer, 4);
*port = socket->peer_port;
}
struct pbuf *p = (struct pbuf*)socket->incoming;
u16_t result = pbuf_copy_partial(p, buf, ((p->tot_len > len) ? len : p->tot_len), 0);
pbuf_free(p);
socket->incoming = NULL;
return (mp_uint_t) result;
}
示例13: process_sslv23_client_hello
/*
* Some browsers use a hybrid SSLv2 "client hello"
*/
int process_sslv23_client_hello(SSL *ssl) {
uint8_t *buf = ssl->bm_data;
int bytes_needed = ((buf[0] & 0x7f) << 8) + buf[1];
int ret = SSL_OK;
/* we have already read 3 extra bytes so far */
// int read_len = SOCKET_READ(ssl->client_fd, buf, bytes_needed-3);
int read_len = pbuf_copy_partial(ssl->ssl_pbuf, buf, bytes_needed - 3, 0);
int cs_len = buf[1];
int id_len = buf[3];
int ch_len = buf[5];
int i, j, offset = 8; /* start at first cipher */
int random_offset = 0;
DISPLAY_BYTES(ssl, "received %d bytes", buf, read_len, read_len);
add_packet(ssl, buf, read_len);
/* connection has gone, so die */
if (bytes_needed < 0) {
return SSL_ERROR_CONN_LOST;
}
/* now work out what cipher suite we are going to use */
for (j = 0; j < NUM_PROTOCOLS; j++) {
for (i = 0; i < cs_len; i += 3) {
if (ssl_prot_prefs[j] == buf[offset + i]) {
ssl->cipher = ssl_prot_prefs[j];
goto server_hello;
}
}
}
/* ouch! protocol is not supported */
ret = SSL_ERROR_NO_CIPHER;
goto error;
server_hello:
/* get the session id */
offset += cs_len - 2; /* we've gone 2 bytes past the end */
#ifndef CONFIG_SSL_SKELETON_MODE
ssl->session = ssl_session_update(ssl->ssl_ctx->num_sessions,
ssl->ssl_ctx->ssl_sessions, ssl, id_len ? &buf[offset] : NULL);
#endif
/* get the client random data */
offset += id_len;
/* random can be anywhere between 16 and 32 bytes long - so it is padded
* with 0's to the left */
if (ch_len == 0x10) {
random_offset += 0x10;
}
memcpy(&ssl->dc->client_random[random_offset], &buf[offset], ch_len);
ret = send_server_hello_sequence(ssl);
error:
return ret;
}
示例14: lwip_tcp_receive
// Helper function for recv/recvfrom to handle TCP packets
STATIC mp_uint_t lwip_tcp_receive(lwip_socket_obj_t *socket, byte *buf, mp_uint_t len, int *_errno) {
// Check for any pending errors
STREAM_ERROR_CHECK(socket);
if (socket->incoming.pbuf == NULL) {
// Non-blocking socket
if (socket->timeout == 0) {
if (socket->state == STATE_PEER_CLOSED) {
return 0;
}
*_errno = MP_EAGAIN;
return -1;
}
mp_uint_t start = mp_hal_ticks_ms();
while (socket->state == STATE_CONNECTED && socket->incoming.pbuf == NULL) {
if (socket->timeout != -1 && mp_hal_ticks_ms() - start > socket->timeout) {
*_errno = MP_ETIMEDOUT;
return -1;
}
poll_sockets();
}
if (socket->state == STATE_PEER_CLOSED) {
if (socket->incoming.pbuf == NULL) {
// socket closed and no data left in buffer
return 0;
}
} else if (socket->state != STATE_CONNECTED) {
assert(socket->state < 0);
*_errno = error_lookup_table[-socket->state];
return -1;
}
}
assert(socket->pcb.tcp != NULL);
struct pbuf *p = socket->incoming.pbuf;
if (socket->leftover_count == 0) {
socket->leftover_count = p->tot_len;
}
u16_t result = pbuf_copy_partial(p, buf, ((socket->leftover_count >= len) ? len : socket->leftover_count), (p->tot_len - socket->leftover_count));
if (socket->leftover_count > len) {
// More left over...
socket->leftover_count -= len;
} else {
pbuf_free(p);
socket->incoming.pbuf = NULL;
socket->leftover_count = 0;
}
tcp_recved(socket->pcb.tcp, result);
return (mp_uint_t) result;
}
示例15: pxdns_query
static void
pxdns_query(struct pxdns *pxdns, struct udp_pcb *pcb, struct pbuf *p,
ipX_addr_t *addr, u16_t port)
{
struct request *req;
int sent;
if (pxdns->nresolvers == 0) {
/* nothing we can do */
pbuf_free(p);
return;
}
req = calloc(1, sizeof(struct request) - 1 + p->tot_len);
if (req == NULL) {
pbuf_free(p);
return;
}
/* copy request data */
req->size = p->tot_len;
pbuf_copy_partial(p, req->data, p->tot_len, 0);
/* save client identity and client's request id */
req->pcb = pcb;
ipX_addr_copy(PCB_ISIPV6(pcb), req->client_addr, *addr);
req->client_port = port;
memcpy(&req->client_id, req->data, sizeof(req->client_id));
/* slap our request id onto it */
req->id = pxdns->id++;
memcpy(req->data, &req->id, sizeof(u16_t));
/* resolver to forward to */
req->generation = pxdns->generation;
req->residx = 0;
/* prepare for relaying the reply back to guest */
req->msg_reply.type = TCPIP_MSG_CALLBACK_STATIC;
req->msg_reply.sem = NULL;
req->msg_reply.msg.cb.function = pxdns_pcb_reply;
req->msg_reply.msg.cb.ctx = (void *)req;
DPRINTF2(("%s: req=%p: client id %d -> id %d\n",
__func__, (void *)req, req->client_id, req->id));
pxdns_request_register(pxdns, req);
sent = pxdns_forward_outbound(pxdns, req);
if (!sent) {
sent = pxdns_rexmit(pxdns, req);
}
if (!sent) {
pxdns_request_deregister(pxdns, req);
pxdns_request_free(req);
}
}