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

📄 socket.lst

📁 W3100A网络调试程序,可进行数据传输
💻 LST
📖 第 1 页 / 共 5 页
字号:
              #endif
 262   3                      }
 263   2                      // 3. write SOCK_INIT commnad
 264   2                      IINCHIP_WRITE(COMMAND(s),CSOCKINIT);
 265   2                      ret = 1;
 266   2              }
 267   1              else
 268   1              {
 269   2                      ret = 0;
 270   2              }
 271   1              return ret;
 272   1      }
 273          
 274          void close(unsigned char s)
 275          {
 276   1              IINCHIP_WRITE(COMMAND(s),CCLOSE);
 277   1      }
 278          
 279          unsigned int select(unsigned char s, unsigned char func)
 280          {
 281   1              unsigned int val;
 282   1      
 283   1              switch (func)
 284   1              {
 285   2              case SEL_CONTROL :
 286   2                      val = (unsigned int)IINCHIP_READ(SOCK_STATUS(s));
 287   2                      break;
 288   2              case SEL_SEND :
 289   2      #ifndef _LITTLE_ENDIAN_
 290   2                      val = IINCHIP_READ(TX_FREE_SIZE_PTR(s));
 291   2                      val = (val << 8) + IINCHIP_READ(TX_FREE_SIZE_PTR(s) + 1);
 292   2      #else
                              val = IINCHIP_READ(TX_FREE_SIZE_PTR(s)+1);
                              val = (val << 8) + IINCHIP_READ(TX_FREE_SIZE_PTR(s));
              #endif
 296   2                      break;
 297   2              case SEL_RECV :
C51 COMPILER V6.21  SOCKET                                                                 05/04/2005 09:30:04 PAGE 6   

 298   2      #ifndef _LITTLE_ENDIAN_
 299   2                      val = IINCHIP_READ(RX_RECV_SIZE_PTR(s));
 300   2                      val = (val << 8) + IINCHIP_READ(RX_RECV_SIZE_PTR(s) + 1);
 301   2      #else
                              val = IINCHIP_READ(RX_RECV_SIZE_PTR(s)+1);
                              val = (val << 8) + IINCHIP_READ(RX_RECV_SIZE_PTR(s));
              #endif
 305   2                      break;
 306   2              default :
 307   2                      val = 0;
 308   2                      break;
 309   2              }
 310   1              return val;
 311   1      }
 312          
 313          /*---------------*/
 314          #ifdef  __TCP_CLIENT__
              /**
              * return : 
              *               1 => success
              *               0 => fail
              */
              unsigned char connect(unsigned char s, unsigned char * addr, unsigned int port)
              {
                      unsigned char ret;
                      if 
                              (
                                      ((addr[0] == 0xFF) && (addr[1] == 0xFF) && (addr[2] == 0xFF) && (addr[3] == 0xFF)) ||
                                      ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) ||
                                      (port == 0x00) 
                              ) 
                      {
                              ret = 0;
                      }
                      else
                      {
                              // 1. write destination IP
                              IINCHIP_WRITE(DST_IP_PTR(s),addr[0]);
                              IINCHIP_WRITE((DST_IP_PTR(s) + 1),addr[1]);
                              IINCHIP_WRITE((DST_IP_PTR(s) + 2),addr[2]);
                              IINCHIP_WRITE((DST_IP_PTR(s) + 3),addr[3]);
                              // 2. write destination Port number
              #ifndef _LITTLE_ENDIAN_
                              IINCHIP_WRITE(DST_PORT_PTR(s),(unsigned char)((port & 0xff00) >> 8));
                              IINCHIP_WRITE((DST_PORT_PTR(s) + 1),(unsigned char)(port & 0x00ff));
              #else
                              IINCHIP_WRITE((DST_PORT_PTR(s)+1),(unsigned char)((port & 0xff00) >> 8));
                              IINCHIP_WRITE(DST_PORT_PTR(s),(unsigned char)(port & 0x00ff));
              #endif
                              // 3. write CONNECT command
                              IINCHIP_WRITE(COMMAND(s),CCONNECT);
                              ret = 1;
                      }
              
                      // blocking mode, if you want to change non-blocking mode, comment these section.
                      /*----*/
                      while (1)
                      {
                              switch (IINCHIP_READ(SOCK_STATUS(s)))
                              {
                                      case SOCK_ESTABLISHED : return 1;
                                      case SOCK_CLOSED : return -1;
C51 COMPILER V6.21  SOCKET                                                                 05/04/2005 09:30:04 PAGE 7   

                                      default :
                                              break;
                              }
                              wait_1us(1);
                      }
                      /*----*/
              }
              #endif
 368          
 369          /*---------------*/
 370          #ifdef  __TCP_SERVER__
 371          void NBlisten(unsigned char s)
 372          {
 373   1              IINCHIP_WRITE(COMMAND(s),CLISTEN);
 374   1      }
 375          #endif
 376          
 377          /*---------------*/
 378          #ifdef  __TCP__
 379          void disconnect(unsigned char s)
 380          {
 381   1              IINCHIP_WRITE(COMMAND(s),CDISCONNECT);
 382   1      }
 383          
 384          
 385          /**
 386          * return
 387          *               n => count of sending data
 388          *               0 => fail to send
 389          */
 390          unsigned int send(unsigned char s, const unsigned char *buf, unsigned int len)
 391          {
 392   1              unsigned int ret, size;
 393   1              ret = 0;
 394   1              while (len > 0)
 395   1              {
 396   2                      size = send_in(s, buf + ret, len, 0x00);
 397   2                      if (size == 0) return 0;
 398   2                      len -= size;
 399   2                      ret += size;
 400   2              }
 401   1              return ret;
 402   1      }
 403          
 404          /**
 405          * return
 406          *               n => count of receving data
 407          * attention
 408          *               len => 捞固 捞窃荐 龋免傈俊 罐篮 荤捞令甫 备秦 弊蔼 捞窍狼 蔼阑 持绢林绢具 茄促.
 409          *                               捞犯霸 窍瘤 臼扁 困秦辑绰, 窃荐救俊辑 促矫 荐脚荤捞令甫 眉农窍绰 内靛啊 眠啊登绢具 茄促.
 410          */
 411          unsigned int recv(unsigned char s, const unsigned char * buf, unsigned int len)
 412          {
 413   1              unsigned int rd_ptr;
 414   1              unsigned int ret;
 415   1              if ( len > 0 )
 416   1              {
 417   2                      // 1. get current rd_prt
 418   2      #ifndef _LITTLE_ENDIAN_
 419   2                      rd_ptr = IINCHIP_READ(RX_RD_PTR(s));
 420   2                      rd_ptr = ((rd_ptr & 0x00ff) << 8) + IINCHIP_READ(RX_RD_PTR(s) + 1);
 421   2      #else
C51 COMPILER V6.21  SOCKET                                                                 05/04/2005 09:30:04 PAGE 8   

                              rd_ptr = IINCHIP_READ(RX_RD_PTR(s)+1);
                              rd_ptr = ((rd_ptr & 0x00ff) << 8) + IINCHIP_READ(RX_RD_PTR(s));
              #endif
 425   2                      // 2. copy data as len
 426   2                      ret = read_data(s, (unsigned char *)rd_ptr, buf, len);
 427   2                      // 3. update rd_ptr
 428   2                      rd_ptr = rd_ptr + len;
 429   2      #ifndef _LITTLE_ENDIAN_
 430   2                      IINCHIP_WRITE(RX_RD_PTR(s),(unsigned char)((rd_ptr & 0xff00) >> 8));
 431   2                      IINCHIP_WRITE((RX_RD_PTR(s) + 1),(unsigned char)(rd_ptr & 0x00ff));
 432   2      #else
                              IINCHIP_WRITE((RX_RD_PTR(s)+1),(unsigned char)((rd_ptr & 0xff00) >> 8));
                              IINCHIP_WRITE(RX_RD_PTR(s),(unsigned char)(rd_ptr & 0x00ff));
              #endif
 436   2                      IINCHIP_WRITE(COMMAND(s),CRECV);
 437   2              }
 438   1              return ret;
 439   1      }
 440          #endif  // __TCP__
 441          
 442          
 443          /*---------------*/
 444          #ifdef  __UDP__
              /**
              * return 
              *               n => count of sending data
              */
              unsigned int sendto(unsigned char s, const unsigned char * buf, unsigned int len, unsigned char * addr, un
             -signed int port)
              {
                      unsigned int ret;
                      if
                              (
                                      ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) ||
                                      (port == 0x00) 
                              ) 
                      {
                              ret = 0;
                      }
                      else
                      {
                              IINCHIP_WRITE(DST_IP_PTR(s),addr[0]);
                              IINCHIP_WRITE((DST_IP_PTR(s) + 1),addr[1]);
                              IINCHIP_WRITE((DST_IP_PTR(s) + 2),addr[2]);
                              IINCHIP_WRITE((DST_IP_PTR(s) + 3),addr[3]);
                              IINCHIP_WRITE(DST_PORT_PTR(s),(unsigned char)((port & 0xff00) >> 8));
                              IINCHIP_WRITE((DST_PORT_PTR(s) + 1),(unsigned char)(port & 0x00ff));
                              ret = send_in(s, buf, len, 0x00);
                      }
                      return ret;
              }
              
              /**
              * return 
              *               n => count of receiving data
              * attention
              *               UDP牢 版快 茄 菩哦 窜困肺 贸府窍霸 等促.
              *               溜, len沥焊俊 1000阑 利菌歹扼档, 茄菩哦捞 500捞搁 500阑 府畔窍绊 辆丰茄促.
              */
              unsigned int recvfrom(unsigned char s, const unsigned char * buf, unsigned int len, unsigned char * addr, 
             -unsigned int * port)
              {
C51 COMPILER V6.21  SOCKET                                                                 05/04/2005 09:30:04 PAGE 9   

                      unsigned char xdata head[8];
                      unsigned int data_len;
                      unsigned int rd_ptr;
                      unsigned char * recv_ptr;
              
                      data_len = 0;
              
              #ifndef _LITTLE_ENDIAN_
                      rd_ptr = IINCHIP_READ(RX_RD_PTR(s));
                      rd_ptr = ((rd_ptr & 0x00ff) << 8) + IINCHIP_READ(RX_RD_PTR(s) + 1);
              #else
                      rd_ptr = IINCHIP_READ(RX_RD_PTR(s)+1);
                      rd_ptr = ((rd_ptr & 0x00ff) << 8) + IINCHIP_READ(RX_RD_PTR(s));
              #endif
                      recv_ptr = (unsigned char *)(rd_ptr);
                              
                      switch (IINCHIP_READ(OPT_PROTOCOL(s)) & 0x07)
                      {
                      case SOCK_DGRAM :
                                      read_data(s, recv_ptr, head, 0x08);
                                      // read peer's IP address, port number.
                                      addr[0] = head[0];
                                      addr[1] = head[1];
                                      addr[2] = head[2];
                                      addr[3] = head[3];
                                      *port = head[4];
                                      *port = (*port << 8) + head[5];
                                      data_len = head[6];
                                      data_len = (data_len << 8) + head[7];
                                      rd_ptr = rd_ptr + data_len + 8;
                                      recv_ptr += 8;
                                      break;
              
                      case SOCK_IPL_RAWM :
                                      read_data(s, recv_ptr, head, 0x06);             // read header.
                                      addr[0] = head[0];
                                      addr[1] = head[1];
                                      addr[2] = head[2];
                                      addr[3] = head[3];
                                      data_len = head[4];
                                      data_len = (data_len << 8) + head[5];
                                      rd_ptr = rd_ptr + data_len + 6;
                                      recv_ptr += 6;
                                      break;
              
                      default :
                                      printf("No support protocol in recvfrom()\r\n");
                                      return 0;
                                      break;
                      }
              
                      if (data_len > len) data_len = len;

⌨️ 快捷键说明

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