📄 tcp.lst
字号:
655 if( NO_OF_TCPSOCKETS == 0 )
656 return(-1);
657
658 if( sochandle > NO_OF_TCPSOCKETS ) {
659 TCP_DEBUGOUT("Socket handle non-valid\r\n");
660 return(-1);
661 }
662
C51 COMPILER V7.06 TCP 11/26/2004 11:32:45 PAGE 12
663 if( sochandle < 0 ) {
664 TCP_DEBUGOUT("Socket handle non-valid\r\n");
665 return(-1);
666 }
667
668 soc = &tcp_socket[sochandle]; /* Get referense */
669
670 return(soc->state);
671
672 }
673
674
675 /** \brief Checks if it's possible to send data using given socket
676 * \ingroup tcp_app_api
677 * \author
678 * \li Jari Lahti (jari.lahti@violasystems.com)
679 * \date 23.07.2002
680 * \param sochandle handle to the socket to be inspected
681 * \return
682 * \li -1 - not possible to send over a socket (previously sent data is
683 * still not akcnowledged)
684 * \li >0 - it is possible to send data over a socket
685 *
686 * Invoke this function to get information whether it is possible to send
687 * data or not. This may, sometimes, be preffered way of getting this type
688 * of information to waiting for #TCP_EVENT_ACK in event_listener function.
689 */
690 INT16 tcp_checksend (INT8 sochandle)
691 {
692 struct tcb* soc;
693
694 if( NO_OF_TCPSOCKETS < 0 )
695 return(-1);
696
697 if( NO_OF_TCPSOCKETS == 0 )
698 return(-1);
699
700 if( sochandle > NO_OF_TCPSOCKETS ) {
701 TCP_DEBUGOUT("Socket handle non-valid\r\n");
702 return(-1);
703 }
704
705 soc = &tcp_socket[sochandle]; /* Get referense */
706
707 if(soc->state != TCP_STATE_CONNECTED)
708 return(-1);
709
710 if(soc->send_unacked == soc->send_next)
711 return(soc->send_mtu);
712
713 return(-1);
714
715
716 }
717
718
719
720 /** \brief Reset connection and place socket to closed state
721 * \ingroup tcp_app_api
722 * \author
723 * \li Jari Lahti (jari.lahti@violasystems.com)
724 * \date 21.07.2002
C51 COMPILER V7.06 TCP 11/26/2004 11:32:45 PAGE 13
725 * \param sochandle handle to socket to be aborted
726 * \return
727 * \li -1 - error
728 * \li >=0 - OK (value represents handle to aborted socket)
729 *
730 * Use this function in cases when TCP connection must be immediately closed.
731 * Note that the preffered (more elegant) way of closing the TCP connection
732 * is to invoke tcp_close() which starts a proper closing procedure.
733 * tcp_abort should be used only in cases when it is really necessary to
734 * immediately and quickly close the connection.
735 */
736 INT8 tcp_abort (INT8 sochandle)
737 {
738 struct tcb* soc;
739
740 TCP_DEBUGOUT("FUNCTION: tcp_abort\r\n");
741
742 if( NO_OF_TCPSOCKETS < 0 )
743 return(-1);
744
745 if( NO_OF_TCPSOCKETS == 0 )
746 return(-1);
747
748 if( sochandle > NO_OF_TCPSOCKETS ) {
749 TCP_DEBUGOUT("Socket handle non-valid\r\n");
750 return(-1);
751 }
752
753 if( sochandle < 0 ) {
754 TCP_DEBUGOUT("Socket handle non-valid\r\n");
755 return(-1);
756 }
757
758 soc = &tcp_socket[sochandle]; /* Get referense */
759
760 switch (soc->state) {
761 case TCP_STATE_FREE:
762 return(-1);
763
764 case TCP_STATE_RESERVED:
765 case TCP_STATE_CLOSED:
766 return(sochandle);
767
768 case TCP_STATE_TIMED_WAIT:
769 case TCP_STATE_LISTENING:
770 tcp_newstate(soc, TCP_STATE_CLOSED);
771 return(sochandle);
772
773 case TCP_STATE_SYN_SENT:
774 case TCP_STATE_SYN_RECEIVED:
775 case TCP_STATE_CONNECTED:
776 case TCP_STATE_FINW1:
777 case TCP_STATE_FINW2:
778 case TCP_STATE_CLOSING:
779 case TCP_STATE_LAST_ACK:
780
781 soc->myflags = TCP_FLAG_RESET;
782 tcp_sendcontrol(sochandle);
783 tcp_newstate(soc, TCP_STATE_CLOSED);
784 return(sochandle);
785
786 default:
C51 COMPILER V7.06 TCP 11/26/2004 11:32:45 PAGE 14
787 return(-1);
788 }
789
790
791 }
792
793
794
795 /** \brief Poll TCP sockets periodically
796 * \ingroup periodic_functions
797 * \author
798 * \li Jari Lahti (jari.lahti@violasystems.com)
799 * \date 19.07.2002
800 * \warning
801 * \li This function <b>must be</b> invoked periodically from
802 * the main loop. See main_demo.c for an example.
803 *
804 * This function checks all TCP sockets and performs various actions
805 * if timeouts occur. What kind of action is performed is defined by the
806 * state of the TCP socket.
807 */
808 void tcp_poll (void)
809 {
810 struct tcb* soc;
811 static UINT8 handle = 0;
812 UINT8 i;
813 INT32 temp;
814 UINT8 old_retries;
815
816 for(i=0; i < NO_OF_TCPSOCKETS; i++ ) {
817
818 if(handle > NO_OF_TCPSOCKETS)
819 handle = 0;
820
821 soc = &tcp_socket[handle];
822
823 switch(soc->state) {
824 case TCP_STATE_FREE:
825 case TCP_STATE_RESERVED:
826 case TCP_STATE_CLOSED:
827 case TCP_STATE_LISTENING:
828
829 break;
830
831 case TCP_STATE_CONNECTED:
832
833 /* In CONNECTED State we have */
834 /* something to do only if we have unacked data */
835 /* or if connection has been IDLE too long or */
836 /* unserved close is isuued by user */
837
838 /*if(soc->send_next > soc->send_unacked)
839 temp = soc->send_next - soc->send_unacked;
840 else
841 temp = soc->send_unacked - soc->send_next;
842 */
843
844 temp = soc->send_next - soc->send_unacked;
845
846 /* Unserved Close? */
847
848 if(soc->flags & TCP_INTFLAGS_CLOSEPENDING) {
C51 COMPILER V7.06 TCP 11/26/2004 11:32:45 PAGE 15
849 /* Can we send the close now */
850
851 if(temp == 0) {
852 soc->myflags = TCP_FLAG_ACK | TCP_FLAG_FIN;
853 soc->send_next++;
854 tcp_sendcontrol(handle);
855 tcp_newstate(soc, TCP_STATE_FINW1);
856 soc->flags ^= TCP_INTFLAGS_CLOSEPENDING;
857
858 handle++;
859
860 return;
861
862 }
863 }
864
865 /* Socket timeout? */
866
867 if(check_timer(soc->persist_timerh) == 0) {
868
869 soc->myflags = TCP_FLAG_ACK | TCP_FLAG_FIN;
870 soc->send_next++;
871 tcp_sendcontrol(handle);
872 tcp_newstate(soc, TCP_STATE_FINW1);
873
874 /* Inform application */
875
876 soc->event_listener(handle, TCP_EVENT_CLOSE, soc->rem_ip, soc->remport);
877
878 handle++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -