⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 api_lib.c

📁 lwIP是瑞士计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。Lwip既可
💻 C
📖 第 1 页 / 共 2 页
字号:
  }  return (conn->err = ERR_OK);}err_tnetconn_bind(struct netconn *conn, struct ip_addr *addr,      u16_t port){  struct api_msg *msg;  if (conn == NULL) {    return ERR_VAL;  }  if (conn->type != NETCONN_TCP &&     conn->recvmbox == SYS_MBOX_NULL) {    if ((conn->recvmbox = sys_mbox_new()) == SYS_MBOX_NULL) {      return ERR_MEM;    }  }    if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {    return (conn->err = ERR_MEM);  }  msg->type = API_MSG_BIND;  msg->msg.conn = conn;  msg->msg.msg.bc.ipaddr = addr;  msg->msg.msg.bc.port = port;  api_msg_post(msg);  sys_mbox_fetch(conn->mbox, NULL);  memp_free(MEMP_API_MSG, msg);  return conn->err;}err_tnetconn_connect(struct netconn *conn, struct ip_addr *addr,       u16_t port){  struct api_msg *msg;    if (conn == NULL) {    return ERR_VAL;  }  if (conn->recvmbox == SYS_MBOX_NULL) {    if ((conn->recvmbox = sys_mbox_new()) == SYS_MBOX_NULL) {      return ERR_MEM;    }  }    if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {    return ERR_MEM;  }  msg->type = API_MSG_CONNECT;  msg->msg.conn = conn;    msg->msg.msg.bc.ipaddr = addr;  msg->msg.msg.bc.port = port;  api_msg_post(msg);  sys_mbox_fetch(conn->mbox, NULL);  memp_free(MEMP_API_MSG, msg);  return conn->err;}err_tnetconn_disconnect(struct netconn *conn){  struct api_msg *msg;    if (conn == NULL) {    return ERR_VAL;  }  if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {    return ERR_MEM;  }  msg->type = API_MSG_DISCONNECT;  msg->msg.conn = conn;    api_msg_post(msg);  sys_mbox_fetch(conn->mbox, NULL);  memp_free(MEMP_API_MSG, msg);  return conn->err;}err_tnetconn_listen(struct netconn *conn){  struct api_msg *msg;  if (conn == NULL) {    return ERR_VAL;  }  if (conn->acceptmbox == SYS_MBOX_NULL) {    conn->acceptmbox = sys_mbox_new();    if (conn->acceptmbox == SYS_MBOX_NULL) {      return ERR_MEM;    }  }    if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {    return (conn->err = ERR_MEM);  }  msg->type = API_MSG_LISTEN;  msg->msg.conn = conn;  api_msg_post(msg);  sys_mbox_fetch(conn->mbox, NULL);  memp_free(MEMP_API_MSG, msg);  return conn->err;}struct netconn *netconn_accept(struct netconn *conn){  struct netconn *newconn;    if (conn == NULL) {    return NULL;  }    sys_mbox_fetch(conn->acceptmbox, (void **)&newconn);  /* Register event with callback */  if (conn->callback)      (*conn->callback)(conn, NETCONN_EVT_RCVMINUS, 0);    return newconn;}struct netbuf *netconn_recv(struct netconn *conn){  struct api_msg *msg;  struct netbuf *buf;  struct pbuf *p;  u16_t len;      if (conn == NULL) {    return NULL;  }    if (conn->recvmbox == SYS_MBOX_NULL) {    conn->err = ERR_CONN;    return NULL;  }  if (conn->err != ERR_OK) {    return NULL;  }  if (conn->type == NETCONN_TCP) {    if (conn->pcb.tcp->state == LISTEN) {      conn->err = ERR_CONN;      return NULL;    }    buf = memp_malloc(MEMP_NETBUF);    if (buf == NULL) {      conn->err = ERR_MEM;      return NULL;    }        sys_mbox_fetch(conn->recvmbox, (void **)&p);    if (p != NULL)    {        len = p->tot_len;        conn->recv_avail -= len;    }    else        len = 0;        /* Register event with callback */      if (conn->callback)        (*conn->callback)(conn, NETCONN_EVT_RCVMINUS, len);    /* If we are closed, we indicate that we no longer wish to receive       data by setting conn->recvmbox to SYS_MBOX_NULL. */    if (p == NULL) {      memp_free(MEMP_NETBUF, buf);      sys_mbox_free(conn->recvmbox);      conn->recvmbox = SYS_MBOX_NULL;      return NULL;    }    buf->p = p;    buf->ptr = p;    buf->fromport = 0;    buf->fromaddr = NULL;    /* Let the stack know that we have taken the data. */    if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {      conn->err = ERR_MEM;      return buf;    }    msg->type = API_MSG_RECV;    msg->msg.conn = conn;    if (buf != NULL) {      msg->msg.msg.len = buf->p->tot_len;    } else {      msg->msg.msg.len = 1;    }    api_msg_post(msg);    sys_mbox_fetch(conn->mbox, NULL);    memp_free(MEMP_API_MSG, msg);  } else {    sys_mbox_fetch(conn->recvmbox, (void **)&buf);  conn->recv_avail -= buf->p->tot_len;    /* Register event with callback */    if (conn->callback)        (*conn->callback)(conn, NETCONN_EVT_RCVMINUS, buf->p->tot_len);  }        LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_recv: received %p (err %d)\n", (void *)buf, conn->err));  return buf;}err_tnetconn_send(struct netconn *conn, struct netbuf *buf){  struct api_msg *msg;  if (conn == NULL) {    return ERR_VAL;  }  if (conn->err != ERR_OK) {    return conn->err;  }  if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {    return (conn->err = ERR_MEM);  }  LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_send: sending %d bytes\n", buf->p->tot_len));  msg->type = API_MSG_SEND;  msg->msg.conn = conn;  msg->msg.msg.p = buf->p;  api_msg_post(msg);  sys_mbox_fetch(conn->mbox, NULL);  memp_free(MEMP_API_MSG, msg);  return conn->err;}err_tnetconn_write(struct netconn *conn, void *dataptr, u16_t size, u8_t copy){  struct api_msg *msg;  u16_t len;    if (conn == NULL) {    return ERR_VAL;  }  if (conn->err != ERR_OK) {    return conn->err;  }    if (conn->sem == SYS_SEM_NULL) {    conn->sem = sys_sem_new(0);    if (conn->sem == SYS_SEM_NULL) {      return ERR_MEM;    }  }  if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {    return (conn->err = ERR_MEM);  }  msg->type = API_MSG_WRITE;  msg->msg.conn = conn;          conn->state = NETCONN_WRITE;  while (conn->err == ERR_OK && size > 0) {    msg->msg.msg.w.dataptr = dataptr;    msg->msg.msg.w.copy = copy;        if (conn->type == NETCONN_TCP) {      if (tcp_sndbuf(conn->pcb.tcp) == 0) {  sys_sem_wait(conn->sem);  if (conn->err != ERR_OK) {    goto ret;  }      }      if (size > tcp_sndbuf(conn->pcb.tcp)) {  /* We cannot send more than one send buffer's worth of data at a     time. */  len = tcp_sndbuf(conn->pcb.tcp);      } else {  len = size;      }    } else {      len = size;    }        LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_write: writing %d bytes (%d)\n", len, copy));    msg->msg.msg.w.len = len;    api_msg_post(msg);    sys_mbox_fetch(conn->mbox, NULL);        if (conn->err == ERR_OK) {      dataptr = (void *)((char *)dataptr + len);      size -= len;    } else if (conn->err == ERR_MEM) {      conn->err = ERR_OK;      sys_sem_wait(conn->sem);    } else {      goto ret;    }  } ret:  memp_free(MEMP_API_MSG, msg);  conn->state = NETCONN_NONE;  if (conn->sem != SYS_SEM_NULL) {    sys_sem_free(conn->sem);    conn->sem = SYS_SEM_NULL;  }    return conn->err;}err_tnetconn_close(struct netconn *conn){  struct api_msg *msg;  if (conn == NULL) {    return ERR_VAL;  }  if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {    return (conn->err = ERR_MEM);  }  conn->state = NETCONN_CLOSE; again:  msg->type = API_MSG_CLOSE;  msg->msg.conn = conn;  api_msg_post(msg);  sys_mbox_fetch(conn->mbox, NULL);  if (conn->err == ERR_MEM &&     conn->sem != SYS_SEM_NULL) {    sys_sem_wait(conn->sem);    goto again;  }  conn->state = NETCONN_NONE;  memp_free(MEMP_API_MSG, msg);  return conn->err;}err_tnetconn_err(struct netconn *conn){  return conn->err;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -