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

📄 shell.c

📁 0.5.3版本的lwip
💻 C
📖 第 1 页 / 共 2 页
字号:
  lport = strtol(com->args[0], NULL, 10);  if(inet_aton(com->args[1], &ipaddr) == -1) {    sendstr(strerror(errno), com->conn);    return ESYNTAX;  }  rport = strtol(com->args[2], NULL, 10);  /* Find the first unused connection in conns. */  for(i = 0; i < NCONNS && conns[i] != NULL; i++);  if(i == NCONNS) {    sendstr("No more connections avaliable, sorry.\n", com->conn);    return ESUCCESS;  }  sendstr("Setting up UDP connection from port ", com->conn);  netconn_write(com->conn, com->args[0], strlen(com->args[0]), NETCONN_COPY);  sendstr(" to ", com->conn);  netconn_write(com->conn, com->args[1], strlen(com->args[1]), NETCONN_COPY);  sendstr(":", com->conn);  netconn_write(com->conn, com->args[2], strlen(com->args[2]), NETCONN_COPY);  sendstr("\n", com->conn);  conns[i] = netconn_new(NETCONN_UDP);  if(conns[i] == NULL) {        sendstr("Could not create connection identifier (out of memory).\n", com->conn);     return ESUCCESS;  }  err = netconn_connect(conns[i], &ipaddr, rport);  if(err != ERR_OK) {    netconn_delete(conns[i]);    conns[i] = NULL;    sendstr("Could not connect to remote host: ", com->conn);#ifdef LWIP_DEBUG    sendstr(lwip_strerr(err), com->conn);#else    sendstr("(debugging must be turned on for error message to appear)", com->conn);#endif /* LWIP_DEBUG */    sendstr("\n", com->conn);    return ESUCCESS;  }  err = netconn_bind(conns[i], IP_ADDR_ANY, lport);  if(err != ERR_OK) {    netconn_delete(conns[i]);    conns[i] = NULL;    sendstr("Could not bind: ", com->conn);#ifdef LWIP_DEBUG    sendstr(lwip_strerr(err), com->conn);#else    sendstr("(debugging must be turned on for error message to appear)", com->conn);#endif /* LWIP_DEBUG */    sendstr("\n", com->conn);    return ESUCCESS;  }  sendstr("Connection set up, connection identifier is ", com->conn);  sprintf(buffer, "%d\n", i);  netconn_write(com->conn, buffer, strlen(buffer), NETCONN_COPY);    return ESUCCESS;}/*-----------------------------------------------------------------------------------*/static s8_tcom_udpl(struct command *com){  struct ip_addr ipaddr;  u16_t lport, rport;  int i;  err_t err;  lport = strtol(com->args[0], NULL, 10);  if(inet_aton(com->args[1], &ipaddr) == -1) {    sendstr(strerror(errno), com->conn);    return ESYNTAX;  }  rport = strtol(com->args[2], NULL, 10);  /* Find the first unused connection in conns. */  for(i = 0; i < NCONNS && conns[i] != NULL; i++);  if(i == NCONNS) {    sendstr("No more connections avaliable, sorry.\n", com->conn);    return ESUCCESS;  }  sendstr("Setting up UDP-Lite connection from port ", com->conn);  netconn_write(com->conn, com->args[0], strlen(com->args[0]), NETCONN_COPY);  sendstr(" to ", com->conn);  netconn_write(com->conn, com->args[1], strlen(com->args[1]), NETCONN_COPY);  sendstr(":", com->conn);  netconn_write(com->conn, com->args[2], strlen(com->args[2]), NETCONN_COPY);  sendstr("\n", com->conn);  conns[i] = netconn_new(NETCONN_UDPLITE);  if(conns[i] == NULL) {        sendstr("Could not create connection identifier (out of memory).\n", com->conn);     return ESUCCESS;  }  err = netconn_connect(conns[i], &ipaddr, rport);  if(err != ERR_OK) {    netconn_delete(conns[i]);    conns[i] = NULL;    sendstr("Could not connect to remote host: ", com->conn);#ifdef LWIP_DEBUG    sendstr(lwip_strerr(err), com->conn);#else    sendstr("(debugging must be turned on for error message to appear)", com->conn);#endif /* LWIP_DEBUG */    sendstr("\n", com->conn);    return ESUCCESS;  }  err = netconn_bind(conns[i], IP_ADDR_ANY, lport);  if(err != ERR_OK) {    netconn_delete(conns[i]);    conns[i] = NULL;    sendstr("Could not bind: ", com->conn);#ifdef LWIP_DEBUG    sendstr(lwip_strerr(err), com->conn);#else    sendstr("(debugging must be turned on for error message to appear)", com->conn);#endif /* LWIP_DEBUG */    sendstr("\n", com->conn);    return ESUCCESS;  }  sendstr("Connection set up, connection identifier is ", com->conn);  sprintf(buffer, "%d\n", i);  netconn_write(com->conn, buffer, strlen(buffer), NETCONN_COPY);    return ESUCCESS;}/*-----------------------------------------------------------------------------------*/static s8_tcom_udpn(struct command *com){  struct ip_addr ipaddr;  u16_t lport, rport;  int i;  err_t err;  lport = strtol(com->args[0], NULL, 10);  if(inet_aton(com->args[1], &ipaddr) == -1) {    sendstr(strerror(errno), com->conn);    return ESYNTAX;  }  rport = strtol(com->args[2], NULL, 10);  /* Find the first unused connection in conns. */  for(i = 0; i < NCONNS && conns[i] != NULL; i++);  if(i == NCONNS) {    sendstr("No more connections avaliable, sorry.\n", com->conn);    return ESUCCESS;  }  sendstr("Setting up UDP connection without checksums from port ", com->conn);  netconn_write(com->conn, com->args[0], strlen(com->args[0]), NETCONN_COPY);  sendstr(" to ", com->conn);  netconn_write(com->conn, com->args[1], strlen(com->args[1]), NETCONN_COPY);  sendstr(":", com->conn);  netconn_write(com->conn, com->args[2], strlen(com->args[2]), NETCONN_COPY);  sendstr("\n", com->conn);  conns[i] = netconn_new(NETCONN_UDPNOCHKSUM);  if(conns[i] == NULL) {        sendstr("Could not create connection identifier (out of memory).\n", com->conn);     return ESUCCESS;  }  err = netconn_connect(conns[i], &ipaddr, rport);  if(err != ERR_OK) {    netconn_delete(conns[i]);    conns[i] = NULL;    sendstr("Could not connect to remote host: ", com->conn);#ifdef LWIP_DEBUG    sendstr(lwip_strerr(err), com->conn);#else    sendstr("(debugging must be turned on for error message to appear)", com->conn);#endif /* LWIP_DEBUG */    sendstr("\n", com->conn);    return ESUCCESS;  }  err = netconn_bind(conns[i], IP_ADDR_ANY, lport);  if(err != ERR_OK) {    netconn_delete(conns[i]);    conns[i] = NULL;    sendstr("Could not bind: ", com->conn);#ifdef LWIP_DEBUG    sendstr(lwip_strerr(err), com->conn);#else    sendstr("(debugging must be turned on for error message to appear)", com->conn);#endif /* LWIP_DEBUG */    sendstr("\n", com->conn);    return ESUCCESS;  }  sendstr("Connection set up, connection identifier is ", com->conn);  sprintf(buffer, "%d\n", i);  netconn_write(com->conn, buffer, strlen(buffer), NETCONN_COPY);    return ESUCCESS;}/*-----------------------------------------------------------------------------------*/static s8_tcom_udpb(struct command *com){  struct ip_addr ipaddr;  u16_t lport, rport;  int i;  err_t err;  struct ip_addr bcaddr;  lport = strtol(com->args[0], NULL, 10);  if(inet_aton(com->args[1], &ipaddr) == -1) {    sendstr(strerror(errno), com->conn);    return ESYNTAX;  }  rport = strtol(com->args[2], NULL, 10);  /* Find the first unused connection in conns. */  for(i = 0; i < NCONNS && conns[i] != NULL; i++);  if(i == NCONNS) {    sendstr("No more connections avaliable, sorry.\n", com->conn);    return ESUCCESS;  }  sendstr("Setting up UDP broadcast connection from port ", com->conn);  netconn_write(com->conn, com->args[0], strlen(com->args[0]), NETCONN_COPY);  sendstr(" to ", com->conn);  netconn_write(com->conn, com->args[1], strlen(com->args[1]), NETCONN_COPY);  sendstr("\n", com->conn);  conns[i] = netconn_new(NETCONN_UDP);  if(conns[i] == NULL) {        sendstr("Could not create connection identifier (out of memory).\n", com->conn);     return ESUCCESS;  }  err = netconn_connect(conns[i], &ipaddr, rport);  if(err != ERR_OK) {    netconn_delete(conns[i]);    conns[i] = NULL;    sendstr("Could not connect to remote host: ", com->conn);#ifdef LWIP_DEBUG    sendstr(lwip_strerr(err), com->conn);#else    sendstr("(debugging must be turned on for error message to appear)", com->conn);#endif /* LWIP_DEBUG */    sendstr("\n", com->conn);    return ESUCCESS;  }  IP4_ADDR(&bcaddr, 255,255,255,255);  err = netconn_bind(conns[i], &bcaddr, lport);  if(err != ERR_OK) {    netconn_delete(conns[i]);    conns[i] = NULL;    sendstr("Could not bind: ", com->conn);#ifdef LWIP_DEBUG    sendstr(lwip_strerr(err), com->conn);#else    sendstr("(debugging must be turned on for error message to appear)", com->conn);#endif /* LWIP_DEBUG */    sendstr("\n", com->conn);    return ESUCCESS;  }  sendstr("Connection set up, connection identifier is ", com->conn);  sprintf(buffer, "%d\n", i);  netconn_write(com->conn, buffer, strlen(buffer), NETCONN_COPY);    return ESUCCESS;}/*-----------------------------------------------------------------------------------*/static s8_tcom_usnd(struct command *com){  int i;  err_t err;  struct netbuf *buf;  char *mem;    i = strtol(com->args[0], NULL, 10);  if(i > NCONNS) {    sendstr("Connection identifier too high.\n", com->conn);    return ESUCCESS;  }  if(conns[i] == NULL) {    sendstr("Connection identifier not in use.\n", com->conn);    return ESUCCESS;  }  buf = netbuf_new();  mem = netbuf_alloc(buf, strlen(com->args[1]) + 1);  if(mem == NULL) {    sendstr("Could not allocate memory for sending.\n", com->conn);    return ESUCCESS;  }  strncpy(mem, com->args[1], strlen(com->args[1]) + 1);  err = netconn_send(conns[i], buf);  netbuf_delete(buf);  if(err != ERR_OK) {    sendstr("Could not send data: ", com->conn);#ifdef LWIP_DEBUG    sendstr(lwip_strerr(err), com->conn);#else    sendstr("(debugging must be turned on for error message to appear)", com->conn);#endif /* LWIP_DEBUG */    sendstr("\n", com->conn);    return ESUCCESS;  }    sendstr("Data sent.\n", com->conn);  return ESUCCESS;}/*-----------------------------------------------------------------------------------*/static s8_tcom_help(struct command *com){  sendstr(help_msg, com->conn);  return ESUCCESS;}/*-----------------------------------------------------------------------------------*/static s8_tparse_command(struct command *com, u32_t len){  u16_t i;  u16_t bufp;    if(strncmp(buffer, "open", 4) == 0) {    com->exec = com_open;    com->nargs = 2;  } else if(strncmp(buffer, "lstn", 4) == 0) {    com->exec = com_lstn;    com->nargs = 1;  } else if(strncmp(buffer, "acpt", 4) == 0) {    com->exec = com_acpt;    com->nargs = 1;  } else if(strncmp(buffer, "clos", 4) == 0) {    com->exec = com_clos;    com->nargs = 1;  } else if(strncmp(buffer, "stat", 4) == 0) {    com->exec = com_stat;    com->nargs = 0;  } else if(strncmp(buffer, "send", 4) == 0) {    com->exec = com_send;    com->nargs = 2;  } else if(strncmp(buffer, "recv", 4) == 0) {    com->exec = com_recv;    com->nargs = 1;  } else if(strncmp(buffer, "udpc", 4) == 0) {    com->exec = com_udpc;    com->nargs = 3;  } else if(strncmp(buffer, "udpb", 4) == 0) {    com->exec = com_udpb;    com->nargs = 2;  } else if(strncmp(buffer, "udpl", 4) == 0) {    com->exec = com_udpl;    com->nargs = 3;  } else if(strncmp(buffer, "udpn", 4) == 0) {    com->exec = com_udpn;    com->nargs = 3;  } else if(strncmp(buffer, "usnd", 4) == 0) {    com->exec = com_usnd;    com->nargs = 2;  } else if(strncmp(buffer, "help", 4) == 0) {    com->exec = com_help;    com->nargs = 0;  } else if(strncmp(buffer, "quit", 4) == 0) {    printf("quit\n");    return ECLOSED;  } else {    return ESYNTAX;  }  if(com->nargs == 0) {    return ESUCCESS;  }  bufp = 0;  for(; bufp < len && buffer[bufp] != ' '; bufp++);  for(i = 0; i < 10; i++) {    for(; bufp < len && buffer[bufp] == ' '; bufp++);    if(buffer[bufp] == '\r' ||       buffer[bufp] == '\n') {      buffer[bufp] = 0;      if(i < com->nargs - 1) {	return ETOOFEW;      }      if(i > com->nargs - 1) {	return ETOOMANY;      }      break;    }        if(bufp > len) {      return ETOOFEW;    }        com->args[i] = &buffer[bufp];    for(; bufp < len && buffer[bufp] != ' ' && buffer[bufp] != '\r' &&	  buffer[bufp] != '\n'; bufp++) {      if(buffer[bufp] == '\\') {	buffer[bufp] = ' ';      }    }    if(bufp > len) {      return ESYNTAX;    }    buffer[bufp] = 0;    bufp++;    if(i == com->nargs - 1) {      break;    }  }  return ESUCCESS;}/*-----------------------------------------------------------------------------------*/static voiderror(s8_t err, struct netconn *conn){  switch(err) {  case ESYNTAX:    sendstr("## Syntax error\n", conn);    break;  case ETOOFEW:    sendstr("## Too few arguments to command given\n", conn);    break;  case ETOOMANY:    sendstr("## Too many arguments to command given\n", conn);    break;  }}/*-----------------------------------------------------------------------------------*/static voidprompt(struct netconn *conn){  sendstr("> ", conn);}  /*-----------------------------------------------------------------------------------*/static voidshell_main(struct netconn *conn){  struct netbuf *buf;  u32_t len;  struct command com;  s8_t err;  int i;    do {    buf = netconn_recv(conn);    if(buf != NULL) {      netbuf_copy(buf, buffer, 1024);      len = netbuf_len(buf);      netbuf_delete(buf);      if(len >= 4) {	if(buffer[0] != 0xff && 	   buffer[1] != 0xfe) {	  err = parse_command(&com, len);	  if(err == ESUCCESS) {		    com.conn = conn;	    err = com.exec(&com);	  }	  if(err != ESUCCESS) {	    error(err, conn);	  }	  if(err == ECLOSED) {	    printf("Closed\n");	    error(err, conn);	    goto close;	  }	} else {	  sendstr("\n\n"	          "lwIP simple interactive shell.\n"	          "(c) Copyright 2001, Swedish Institute of Computer Science.\n"	          "Written by Adam Dunkels.\n"	          "For help, try the \"help\" command.\n", conn);	}      }    }    if(buf != NULL) {      prompt(conn);    }  } while(buf != NULL);  printf("buf == NULL err %s\n", lwip_strerr(conn->err)); close:    netconn_close(conn);    for(i = 0; i < NCONNS; i++) {    if(conns[i] != NULL) {      netconn_delete(conns[i]);    }    conns[i] = NULL;  }  }/*-----------------------------------------------------------------------------------*/static void shell_thread(void *arg){  struct netconn *conn, *newconn;    conn = netconn_new(NETCONN_TCP);  netconn_bind(conn, NULL, 23);  netconn_listen(conn);  while(1) {    newconn = netconn_accept(conn);    shell_main(newconn);    netconn_delete(newconn);  }}/*-----------------------------------------------------------------------------------*/voidshell_init(void)     {  sys_thread_new(shell_thread, NULL);}

⌨️ 快捷键说明

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