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

📄 tcp.lst

📁 cs8900 c51应用
💻 LST
📖 第 1 页 / 共 5 页
字号:
 429                  
 430                  /* Then just set parameters and send SYN        */
 431                  
 432                  soc->rem_ip = ip;
 433                  soc->remport = rport;
 434                  soc->locport = myport;
 435                  soc->flags = 0;
 436                  soc->send_mtu = TCP_DEF_MTU;
 437                  
 438                  /* get initial sequence number  */
 439                  
 440                  soc->send_unacked = tcp_initseq(); 
 441                  soc->send_next = soc->send_unacked + 1;
 442                  soc->myflags = TCP_FLAG_SYN;
 443                  tcp_sendcontrol(sochandle);
 444                  tcp_newstate(soc, TCP_STATE_SYN_SENT);
 445                  
 446                  return(sochandle);
 447          }
 448          
 449          
 450          
 451          /** \brief Send user data over TCP using given TCP socket
 452           *  \ingroup tcp_app_api
 453           *      \author 
 454           *              \li Jari Lahti (jari.lahti@violasystems.com)
 455           *      \date 25.07.2002
 456           *      \param sockethandle handle to TCP socket to be used for sending data
 457           *      \param buf pointer to data buffer (start of user data)
 458           *      \param blen buffer length in bytes (without space reserved at the
 459           *              beginning of buffer for headers)
 460           *      \param dlen length of user data to be sent (in bytes)
 461           *      \return 
 462           *              \li -1 - Error
 463           *              \li >0 - OK (number represents number of bytes actually sent)
 464           *
 465           *      \warning
 466           *              \li <i>buf</i> parameter is a pointer to data to be sent in 
 467           *              user buffer. But note that there <b>MUST</b> be sufficient
 468           *              free buffer space before that data for TCP header (of #MIN_TCP_HLEN
 469           *              size). 
 470           *
 471           *      Invoke this function to initiate data sending over TCP connection
 472           *      established over a TCP socket. Since data is not buffered (in order
 473           *      to reduce RAM memory consumption) new data can not be sent until
 474           *      data that was previously sent is acknowledged. So, application knows when
 475           *      it can send new data either by:
 476           *              \li waiting for TCP_EVENT_ACK in event_listener function
C51 COMPILER V7.06   TCP                                                                   11/26/2004 11:32:45 PAGE 9   

 477           *              \li invoking tcp_check_send() function to check if it is possible
 478           *                      to send data
 479           *
 480           */
 481          INT16 tcp_send (INT8 sockethandle, UINT8* buf, UINT16 blen, UINT16 dlen)
 482          {
 483                  struct tcb* soc;
 484                  UINT8 i;
 485          
 486                  
 487                  TCP_DEBUGOUT("Entering to send TCP data packet\r\n");
 488                  
 489                  kick_WD();
 490                  
 491                  if( sockethandle < 0 ) {
 492                          TCP_DEBUGOUT("ERROR:Socket Handle not valid (<0)\r\n");
 493                          return(-1);
 494                  }
 495                  
 496                  if( sockethandle > NO_OF_TCPSOCKETS ) {
 497                          TCP_DEBUGOUT("ERROR:Socket Handle not valid (>NO_OF_TCPSOCKETS)\r\n");
 498                          return(-1);
 499                  }
 500                  
 501                  soc = &tcp_socket[sockethandle];                                /* Get socket   */
 502                  
 503                  if(soc->state != TCP_STATE_CONNECTED) {
 504                          TCP_DEBUGOUT("TCP is not connected!!\r\n");
 505                          return(-1);
 506                  }
 507                  
 508                  if(soc->send_unacked != soc->send_next) {
 509                          TCP_DEBUGOUT("TCP contains unacked data, cannot send more\r\n");
 510                          return(-1);
 511                  }
 512                  
 513                  if( dlen > blen )
 514                          dlen = blen;
 515                  
 516                  if(dlen + MIN_TCP_HLEN > soc->send_mtu) {
 517                          if(soc->send_mtu > MIN_TCP_HLEN)
 518                                  dlen = soc->send_mtu - MIN_TCP_HLEN;
 519                          else
 520                                  return(-1);
 521                  }
 522                  
 523                  soc->send_next += dlen;
 524                  
 525                  soc->myflags = TCP_FLAG_ACK | TCP_FLAG_PUSH;
 526                  process_tcp_out(sockethandle, buf - MIN_TCP_HLEN, blen + MIN_TCP_HLEN + 1, dlen);
 527                  
 528                  return(dlen);
 529          }
 530          
 531          
 532          /** \brief Initiate TCP connection closing procedure
 533           *  \ingroup tcp_app_api
 534           *      \author 
 535           *              \li Jari Lahti (jari.lahti@violasystems.com)
 536           *      \date 21.07.2002
 537           *      \param sochandle handle to socket on which TCP connection is to be closed
 538           *      \return 
C51 COMPILER V7.06   TCP                                                                   11/26/2004 11:32:45 PAGE 10  

 539           *              \li -2 - there is unacked data on this socket. Try again later.
 540           *              \li -1 - Error
 541           *              \li >=0 - OK (connection closing procedure started. Handle to socket
 542           *                      returned)
 543           *
 544           *      Invoke this function to start connetion closing procedure over a given
 545           *      socket. Note that connection is not immediately closed. It may take some
 546           *      time for that to happen. Event_listener function will be invoked with 
 547           *      appropriate event when that really happens.
 548           */
 549          INT8 tcp_close (INT8 sochandle)
 550          {
 551                  struct tcb* soc;
 552                  
 553                  TCP_DEBUGOUT("FUNCTION: tcp_close\r\n");
 554          
 555                  if( NO_OF_TCPSOCKETS < 0 )
 556                          return(-1);
 557                  
 558                  if( NO_OF_TCPSOCKETS == 0 )
 559                          return(-1);
 560                  
 561                  if( sochandle > NO_OF_TCPSOCKETS ) {
 562                          TCP_DEBUGOUT("Socket handle non-valid\r\n");
 563                          return(-1);
 564                  }
 565                  
 566                  if( sochandle < 0 ) {
 567                          TCP_DEBUGOUT("Socket handle non-valid\r\n");
 568                          return(-1);
 569                  }
 570                  
 571                  soc = &tcp_socket[sochandle];           /* Get referense        */      
 572                  
 573                  switch(soc->state) {
 574                          case TCP_STATE_LISTENING:
 575                                  tcp_newstate(soc, TCP_STATE_CLOSED);
 576                                  break;
 577                          
 578                          case TCP_STATE_SYN_RECEIVED:
 579                                  soc->myflags = TCP_FLAG_ACK | TCP_FLAG_FIN;
 580                                  soc->send_unacked++;
 581                                  soc->send_next++;
 582                                  tcp_sendcontrol(sochandle);
 583                                  tcp_newstate(soc, TCP_STATE_FINW1);
 584                                  break;
 585                          
 586                          case TCP_STATE_SYN_SENT:
 587                          
 588                                  tcp_newstate(soc, TCP_STATE_CLOSED);
 589                          
 590                                  break;
 591                          
 592                          case TCP_STATE_FINW1:
 593                          case TCP_STATE_FINW2:
 594                          case TCP_STATE_CLOSING:
 595                          case TCP_STATE_TIMED_WAIT:
 596                          case TCP_STATE_LAST_ACK:
 597                          
 598                                  /* We are closing already       */
 599                                  
 600                                  break;
C51 COMPILER V7.06   TCP                                                                   11/26/2004 11:32:45 PAGE 11  

 601                          
 602                          case TCP_STATE_CONNECTED:
 603                          
 604                                  /* Is there unacked data?       */
 605                                  
 606                                  if(soc->send_unacked == soc->send_next ) {
 607                                          /* There is no unacked data     */
 608                                          
 609                                          soc->myflags = TCP_FLAG_ACK | TCP_FLAG_FIN;
 610                                          soc->send_next++;
 611                                          tcp_sendcontrol(sochandle);
 612                                          tcp_newstate(soc, TCP_STATE_FINW1);                             
 613                                  } else {
 614                                          /* Can't do much but raise pollable flag to soc->flags          */
 615                                          /* and process it on tcp_poll                                                           */
 616                                          
 617                                          soc->flags |= TCP_INTFLAGS_CLOSEPENDING;
 618                                          
 619                                          
 620                                          return(sochandle);
 621                                  }
 622                          
 623                                  break;
 624                  
 625                          default:
 626                                  return(-1);
 627                  }
 628                  
 629                  return(sochandle);
 630          
 631          }
 632          
 633          
 634          
 635          /** \brief Get current state of the socket
 636           *  \ingroup tcp_app_api
 637           *      \author 
 638           *              \li Jari Lahti (jari.lahti@violasystems.com)
 639           *      \date 21.07.2002
 640           *      \param sochandle handle to the socket to be queried
 641           *      \return
 642           *              \li -1 - Error
 643           *              \li >0 - Socket state
 644           *
 645           *      Use this function for querying socket state. This is usually not needed
 646           *      directly, but could be usefull for some special purposes.
 647           */
 648          INT8 tcp_getstate (INT8 sochandle)
 649          {
 650                  struct tcb* soc;
 651          
 652                  if( NO_OF_TCPSOCKETS < 0 )
 653                          return(-1);
 654                  

⌨️ 快捷键说明

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