shell.c

来自「Keil下移植好的lwip基于c166」· C语言 代码 · 共 1,061 行 · 第 1/3 页

C
1,061
字号
    sendstr("Connection identifier not in use.\n", com->conn);
    return ESUCCESS;
  }

  err = netconn_close(conns[i]);
  if(err != ERR_OK) {
    sendstr("Could not close connection: ", 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 closed.\n", com->conn);
  netconn_delete(conns[i]);
  conns[i] = NULL;
  return ESUCCESS;
}
/*-----------------------------------------------------------------------------------*/
static s8_t
com_acpt(struct command *com)
{
  int i, j;

  /* Find the first unused connection in conns. */
  for(j = 0; j < NCONNS && conns[j] != NULL; j++);

  if(j == NCONNS) {
    sendstr("No more connections avaliable, sorry.\n", com->conn);
    return ESUCCESS;
  }

  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;
  }

  conns[j] = netconn_accept(conns[i]);
  
  if(conns[j] == NULL) {
    sendstr("Could not accept connection: ", com->conn);
#ifdef LWIP_DEBUG
    sendstr(lwip_strerr(netconn_err(conns[i])), 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("Accepted connection, connection identifier for new connection is ", com->conn);
  sprintf((char *)buffer, "%d\n", j);
  netconn_write(com->conn, buffer, strlen((const char *)buffer), NETCONN_COPY);

  return ESUCCESS;
}
/*-----------------------------------------------------------------------------------*/
static s8_t
com_stat(struct command *com)
{
  int i;
  char buf[100];
  u16_t len;
  
  for(i = 0; i < sizeof(struct stats_) / 2; i++) {
    len = sprintf(buf, "%d", ((u16_t *)&lwip_stats)[i]);
    sendstr(stat_msgs[i], com->conn);
    netconn_write(com->conn, buf, len, NETCONN_COPY);
    sendstr("\n", com->conn);
  }

  
  return ESUCCESS;
}
/*-----------------------------------------------------------------------------------*/
static s8_t
com_send(struct command *com)
{
  int i;
  err_t err;
  int len;
  
  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;
  }

  len = strlen(com->args[1]);
  com->args[1][len] = '\r';
  com->args[1][len + 1] = '\n';
  com->args[1][len + 2] = 0;
  
  err = netconn_write(conns[i], com->args[1], len + 3, NETCONN_COPY);
  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 enqueued for sending.\n", com->conn);
  return ESUCCESS;
}
/*-----------------------------------------------------------------------------------*/
static s8_t
com_recv(struct command *com)
{
  int i;
  err_t err;
  struct netbuf *buf;
  u16_t len;
  
  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 = netconn_recv(conns[i]);
  if(buf != NULL) {
      
    netbuf_copy(buf, buffer, 1024);
    len = netbuf_len(buf);
    sendstr("Reading from connection:\n", com->conn);
    netconn_write(com->conn, buffer, len, NETCONN_COPY);
    netbuf_delete(buf);
  } else {
    sendstr("EOF.\n", com->conn); 
  }
  err = netconn_err(conns[i]);
  if(err != ERR_OK) {
    sendstr("Could not receive 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;
  }
  return ESUCCESS;
}
/*-----------------------------------------------------------------------------------*/
static s8_t
com_udpc(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], (struct in_addr *)&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((char *)buffer, "%d\n", i);
  netconn_write(com->conn, buffer, strlen((const char *)buffer), NETCONN_COPY);
  
  return ESUCCESS;
}
/*-----------------------------------------------------------------------------------*/
static s8_t
com_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], (struct in_addr *)&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((char *)buffer, "%d\n", i);
  netconn_write(com->conn, buffer, strlen((const char *)buffer), NETCONN_COPY);
  
  return ESUCCESS;
}
/*-----------------------------------------------------------------------------------*/
static s8_t
com_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], (struct in_addr *)&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;

⌨️ 快捷键说明

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