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

📄 api_msg.c

📁 《嵌入式网络系统设计-基于Atmel ARM7 系列》这个本书的光盘资料
💻 C
📖 第 1 页 / 共 2 页
字号:
      udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);      break;    case NETCONN_UDPNOCHKSUM:      msg->conn->pcb.udp = udp_new();      udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_NOCHKSUM);      udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);      break;    case NETCONN_UDP:      msg->conn->pcb.udp = udp_new();      udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);      break;#endif /* LWIP_UDP */#if LWIP_TCP          case NETCONN_TCP:      msg->conn->pcb.tcp = tcp_new();      setup_tcp(msg->conn);#endif /* LWIP_TCP */    default:      break;    }  }  switch (msg->conn->type) {#if LWIP_RAW  case NETCONN_RAW:    msg->conn->err = raw_bind(msg->conn->pcb.raw,msg->msg.bc.ipaddr);    break;#endif#if LWIP_UDP  case NETCONN_UDPLITE:    /* FALLTHROUGH */  case NETCONN_UDPNOCHKSUM:    /* FALLTHROUGH */  case NETCONN_UDP:    msg->conn->err = udp_bind(msg->conn->pcb.udp, msg->msg.bc.ipaddr, msg->msg.bc.port);    break;#endif /* LWIP_UDP */#if LWIP_TCP  case NETCONN_TCP:    msg->conn->err = tcp_bind(msg->conn->pcb.tcp,            msg->msg.bc.ipaddr, msg->msg.bc.port);#endif /* LWIP_TCP */  default:    break;  }  sys_mbox_post(msg->conn->mbox, NULL);}#if LWIP_TCPstatic err_tdo_connected(void *arg, struct tcp_pcb *pcb, err_t err){  struct netconn *conn;  conn = arg;  if (conn == NULL) {    return ERR_VAL;  }    conn->err = err;  if (conn->type == NETCONN_TCP && err == ERR_OK) {    setup_tcp(conn);  }      sys_mbox_post(conn->mbox, NULL);  return ERR_OK;}#endif  static voiddo_connect(struct api_msg_msg *msg){  if (msg->conn->pcb.tcp == NULL) {    switch (msg->conn->type) {#if LWIP_RAW    case NETCONN_RAW:      msg->conn->pcb.raw = raw_new(msg->msg.bc.port); /* misusing the port field as protocol */      raw_recv(msg->conn->pcb.raw, recv_raw, msg->conn);      break;#endif#if LWIP_UDP    case NETCONN_UDPLITE:      msg->conn->pcb.udp = udp_new();      if (msg->conn->pcb.udp == NULL) {  msg->conn->err = ERR_MEM;  sys_mbox_post(msg->conn->mbox, NULL);  return;      }      udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_UDPLITE);      udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);      break;    case NETCONN_UDPNOCHKSUM:      msg->conn->pcb.udp = udp_new();      if (msg->conn->pcb.udp == NULL) {  msg->conn->err = ERR_MEM;  sys_mbox_post(msg->conn->mbox, NULL);  return;      }      udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_NOCHKSUM);      udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);      break;    case NETCONN_UDP:      msg->conn->pcb.udp = udp_new();      if (msg->conn->pcb.udp == NULL) {  msg->conn->err = ERR_MEM;  sys_mbox_post(msg->conn->mbox, NULL);  return;      }      udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);      break;#endif /* LWIP_UDP */#if LWIP_TCP          case NETCONN_TCP:      msg->conn->pcb.tcp = tcp_new();            if (msg->conn->pcb.tcp == NULL) {  msg->conn->err = ERR_MEM;  sys_mbox_post(msg->conn->mbox, NULL);  return;      }#endif    default:      break;    }  }  switch (msg->conn->type) {#if LWIP_RAW  case NETCONN_RAW:    raw_connect(msg->conn->pcb.raw, msg->msg.bc.ipaddr);    sys_mbox_post(msg->conn->mbox, NULL);    break;#endif#if LWIP_UDP  case NETCONN_UDPLITE:    /* FALLTHROUGH */  case NETCONN_UDPNOCHKSUM:    /* FALLTHROUGH */  case NETCONN_UDP:    udp_connect(msg->conn->pcb.udp, msg->msg.bc.ipaddr, msg->msg.bc.port);    sys_mbox_post(msg->conn->mbox, NULL);    break;#endif #if LWIP_TCP        case NETCONN_TCP:    /*    tcp_arg(msg->conn->pcb.tcp, msg->conn);*/    setup_tcp(msg->conn);    tcp_connect(msg->conn->pcb.tcp, msg->msg.bc.ipaddr, msg->msg.bc.port,    do_connected);    /*tcp_output(msg->conn->pcb.tcp);*/#endif  default:    break;  }}static voiddo_disconnect(struct api_msg_msg *msg){  switch (msg->conn->type) {#if LWIP_RAW  case NETCONN_RAW:    /* Do nothing as connecting is only a helper for upper lwip layers */    break;#endif#if LWIP_UDP  case NETCONN_UDPLITE:    /* FALLTHROUGH */  case NETCONN_UDPNOCHKSUM:    /* FALLTHROUGH */  case NETCONN_UDP:    udp_disconnect(msg->conn->pcb.udp);    break;#endif   case NETCONN_TCP:    break;  }  sys_mbox_post(msg->conn->mbox, NULL);}static voiddo_listen(struct api_msg_msg *msg){  if (msg->conn->pcb.tcp != NULL) {    switch (msg->conn->type) {#if LWIP_RAW    case NETCONN_RAW:      LWIP_DEBUGF(API_MSG_DEBUG, ("api_msg: listen RAW: cannot listen for RAW.\n"));      break;#endif#if LWIP_UDP    case NETCONN_UDPLITE:      /* FALLTHROUGH */    case NETCONN_UDPNOCHKSUM:      /* FALLTHROUGH */    case NETCONN_UDP:      LWIP_DEBUGF(API_MSG_DEBUG, ("api_msg: listen UDP: cannot listen for UDP.\n"));      break;#endif /* LWIP_UDP */#if LWIP_TCP          case NETCONN_TCP:      msg->conn->pcb.tcp = tcp_listen(msg->conn->pcb.tcp);      if (msg->conn->pcb.tcp == NULL) {  msg->conn->err = ERR_MEM;      } else {  if (msg->conn->acceptmbox == SYS_MBOX_NULL) {    msg->conn->acceptmbox = sys_mbox_new();    if (msg->conn->acceptmbox == SYS_MBOX_NULL) {      msg->conn->err = ERR_MEM;      break;    }  }  tcp_arg(msg->conn->pcb.tcp, msg->conn);  tcp_accept(msg->conn->pcb.tcp, accept_function);      }#endif    default:      break;    }  }  sys_mbox_post(msg->conn->mbox, NULL);}static voiddo_accept(struct api_msg_msg *msg){  if (msg->conn->pcb.tcp != NULL) {    switch (msg->conn->type) {#if LWIP_RAW    case NETCONN_RAW:      LWIP_DEBUGF(API_MSG_DEBUG, ("api_msg: accept RAW: cannot accept for RAW.\n"));      break;#endif#if LWIP_UDP    case NETCONN_UDPLITE:      /* FALLTHROUGH */    case NETCONN_UDPNOCHKSUM:      /* FALLTHROUGH */    case NETCONN_UDP:          LWIP_DEBUGF(API_MSG_DEBUG, ("api_msg: accept UDP: cannot accept for UDP.\n"));      break;#endif /* LWIP_UDP */    case NETCONN_TCP:      break;    }  }}static voiddo_send(struct api_msg_msg *msg){  if (msg->conn->pcb.tcp != NULL) {    switch (msg->conn->type) {#if LWIP_RAW    case NETCONN_RAW:      raw_send(msg->conn->pcb.raw, msg->msg.p);      break;#endif#if LWIP_UDP    case NETCONN_UDPLITE:      /* FALLTHROUGH */    case NETCONN_UDPNOCHKSUM:      /* FALLTHROUGH */    case NETCONN_UDP:      udp_send(msg->conn->pcb.udp, msg->msg.p);      break;#endif /* LWIP_UDP */    case NETCONN_TCP:      break;    }  }  sys_mbox_post(msg->conn->mbox, NULL);}static voiddo_recv(struct api_msg_msg *msg){#if LWIP_TCP  if (msg->conn->pcb.tcp != NULL) {    if (msg->conn->type == NETCONN_TCP) {      tcp_recved(msg->conn->pcb.tcp, msg->msg.len);    }  }#endif    sys_mbox_post(msg->conn->mbox, NULL);}static voiddo_write(struct api_msg_msg *msg){#if LWIP_TCP    err_t err;#endif    if (msg->conn->pcb.tcp != NULL) {    switch (msg->conn->type) {#if LWIP_RAW    case NETCONN_RAW:      msg->conn->err = ERR_VAL;      break;#endif#if LWIP_UDP     case NETCONN_UDPLITE:      /* FALLTHROUGH */    case NETCONN_UDPNOCHKSUM:      /* FALLTHROUGH */    case NETCONN_UDP:      msg->conn->err = ERR_VAL;      break;#endif /* LWIP_UDP */#if LWIP_TCP     case NETCONN_TCP:            err = tcp_write(msg->conn->pcb.tcp, msg->msg.w.dataptr,                      msg->msg.w.len, msg->msg.w.copy);      /* This is the Nagle algorithm: inhibit the sending of new TCP   segments when new outgoing data arrives from the user if any   previously transmitted data on the connection remains   unacknowledged. */      if(err == ERR_OK && (msg->conn->pcb.tcp->unacked == NULL ||        (msg->conn->pcb.tcp->flags & TF_NODELAY) ||         (msg->conn->pcb.tcp->snd_queuelen) > 1)) {          tcp_output(msg->conn->pcb.tcp);      }      msg->conn->err = err;      if (msg->conn->callback)          if (err == ERR_OK)          {              if (tcp_sndbuf(msg->conn->pcb.tcp) <= TCP_SNDLOWAT)                  (*msg->conn->callback)(msg->conn, NETCONN_EVT_SENDMINUS, msg->msg.w.len);          }#endif    default:      break;    }  }  sys_mbox_post(msg->conn->mbox, NULL);}static voiddo_close(struct api_msg_msg *msg){  err_t err;  err = ERR_OK;  if (msg->conn->pcb.tcp != NULL) {    switch (msg->conn->type) {#if LWIP_RAW    case NETCONN_RAW:      break;#endif#if LWIP_UDP    case NETCONN_UDPLITE:      /* FALLTHROUGH */    case NETCONN_UDPNOCHKSUM:      /* FALLTHROUGH */    case NETCONN_UDP:      break;#endif /* LWIP_UDP */#if LWIP_TCP    case NETCONN_TCP:      if (msg->conn->pcb.tcp->state == LISTEN) {        err = tcp_close(msg->conn->pcb.tcp);      }      else if (msg->conn->pcb.tcp->state == CLOSE_WAIT) {        err = tcp_output(msg->conn->pcb.tcp);      }      msg->conn->err = err;      #endif    default:            break;    }  }  sys_mbox_post(msg->conn->mbox, NULL);}typedef void (* api_msg_decode)(struct api_msg_msg *msg);static api_msg_decode decode[API_MSG_MAX] = {  do_newconn,  do_delconn,  do_bind,  do_connect,  do_disconnect,  do_listen,  do_accept,  do_send,  do_recv,  do_write,  do_close  };voidapi_msg_input(struct api_msg *msg){    decode[msg->type](&(msg->msg));}voidapi_msg_post(struct api_msg *msg){  tcpip_apimsg(msg);}

⌨️ 快捷键说明

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