📄 api_msg.c
字号:
/* 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_TCP/*-----------------------------------------------------------------------------------*/static 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_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_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_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_UDP case NETCONN_UDPLITE: /* FALLTHROUGH */ case NETCONN_UDPNOCHKSUM: /* FALLTHROUGH */ case NETCONN_UDP: 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_UDP case NETCONN_UDPLITE: /* FALLTHROUGH */ case NETCONN_UDPNOCHKSUM: /* FALLTHROUGH */ case NETCONN_UDP: 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_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_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) { 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_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); } 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 + -