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

📄 tcpabort.c

📁 用于嵌入式系统的TCP/IP协议栈
💻 C
字号:
/***********************************************************************//*                                                                     *//*   Module:  tcp_ip/tcp/tcpabort.c                                    *//*   Release: 2001.3                                                   *//*   Version: 99.0                                                     *//*   Purpose: Miscellaneous Routines                                   *//*                                                                     *//*---------------------------------------------------------------------*//*                                                                     *//*               Copyright 1999, Blunk Microsystems                    *//*                      ALL RIGHTS RESERVED                            *//*                                                                     *//*   Licensees have the non-exclusive right to use, modify, or extract *//*   this computer program for software development at a single site.  *//*   This program may be resold or disseminated in executable format   *//*   only. The source code may not be redistributed or resold.         *//*                                                                     *//***********************************************************************/#include <stdio.h>#include "../tcp_ipp.h"#include "tcp.h"/***********************************************************************//* Local Function Definitions                                          *//***********************************************************************//***********************************************************************//*  ticks_left: Return number of ticks prior to expiration             *//*                                                                     *//*       Input: timer = pointer to timer control block                 *//*                                                                     *//***********************************************************************/static int ticks_left(const TcpTmr *timer){  if (timer->running)    return timer->time_due - NetTickCount;  else    return 0;}/***********************************************************************//* Global Function Definitions                                         *//***********************************************************************//***********************************************************************//*     TcpDrop: Drop a TCP connection due to error                     *//*                                                                     *//***********************************************************************/void TcpDrop(SOCKET sock, int error){  /*-------------------------------------------------------------------*/  /* Save error in socket control block.                               */  /*-------------------------------------------------------------------*/  sock->error = error;  /*-------------------------------------------------------------------*/  /* Return if socket is already closed.                               */  /*-------------------------------------------------------------------*/  if (sock->state == SS_CLOSED)    return;  /*-------------------------------------------------------------------*/  /* Update statistics.                                                */  /*-------------------------------------------------------------------*/  if (sock->flags & SF_CONNECTED)    --Stats.TcpCurrEstab;  else    ++Stats.TcpAttemptFails;  /*-------------------------------------------------------------------*/  /* Post error event, set closed state, and clear connected flag.     */  /*-------------------------------------------------------------------*/  NetPostEvent(sock, SE_ERROR);  sock->state = SS_CLOSED;  sock->flags &= ~(SF_CONNECTED | SF_SNDFIN | SF_SENDFLG | TCPF_SYN);  /*-------------------------------------------------------------------*/  /* Stop all socket timers.                                           */  /*-------------------------------------------------------------------*/  NetTimerStop(&sock->state_tmr);  NetTimerStop(&sock->out_tmr);  NetTimerStop(&sock->ack_tmr);  /*-------------------------------------------------------------------*/  /* Cancel output.                                                    */  /*-------------------------------------------------------------------*/  sock->out_state = TCPO_IDLE;  sock->sb_count = 0;  sock->snd_nxt = sock->snt_una;  Net.TryOut = FALSE;  /*-------------------------------------------------------------------*/  /* Strip socket memory resources (except receive buffer).            */  /*-------------------------------------------------------------------*/  TcpStrip(sock, FREE_SBUF);  /*-------------------------------------------------------------------*/  /* Release protocol's hold on socket.                                */  /*-------------------------------------------------------------------*/  SockRelease(sock);}/***********************************************************************//* TcpQuerySock: Loop through TCP socket list, reporting status        *//*                                                                     *//***********************************************************************/void TcpQuerySock(void){  int i;  CircLink *link = TcpLruList.next_bck;  /*-------------------------------------------------------------------*/  /* Sweep through LRU-sorted TCP socket list.                         */  /*-------------------------------------------------------------------*/  for (; link != &TcpLruList; link = link->next_bck)  {    char *state, *ostate;    SOCKET sock = (SOCKET)link;    printf(" %2u TCP ", (sock - &Socks[0]) + 1);    switch (sock->state)    {      case SS_CLOSED:      state = "CLOSED"; break;      case SS_LISTEN:      state = "LISTEN"; break;      case SS_SYNSENT:     state = "SYN_SENT"; break;      case SS_SYNRCVD:     state = "SYN_RCVD"; break;      case SS_ESTABLISHED: state = "ESTABLISHD"; break;      case SS_FINWAIT1:    state = "FIN_WAIT1"; break;      case SS_FINWAIT2:    state = "FIN_WAIT2"; break;      case SS_CLOSEWAIT:   state = "CLOSE_WAIT"; break;      case SS_LASTACK:     state = "LAST_ACK"; break;      case SS_CLOSING:     state = "CLOSING"; break;      case SS_TIMEWAIT:    state = "TIME_WAIT"; break;      default: state = "err"; break;    }    switch (sock->out_state)    {      case TCPO_IDLE:    ostate = "(idle)"; break;      case TCPO_XMIT:    ostate = "(trans)"; break;      case TCPO_REXMT:   ostate = "(rxmit)"; break;      case TCPO_PERSIST: ostate = "(pers)"; break;      default: ostate = "err"; break;    }    i = printf("%s%s  ", state, ostate);    for (; i < 18; ++i) putchar(' ');    printf("state/out/ack = ");    /*-----------------------------------------------------------------*/    /* Show state timer status.                                        */    /*-----------------------------------------------------------------*/    i = (ticks_left(&sock->state_tmr) * 10) / TICKS_PER_SEC;    printf("%u.%u/", i / 10, i % 10);    /*-----------------------------------------------------------------*/    /* Show output timer status.                                       */    /*-----------------------------------------------------------------*/    i = (ticks_left(&sock->out_tmr) * 10) / TICKS_PER_SEC;    printf("%u.%u/", i / 10, i % 10);    /*-----------------------------------------------------------------*/    /* Show delayed acknowledgment timer status.                       */    /*-----------------------------------------------------------------*/    i = (ticks_left(&sock->ack_tmr) * 10) / TICKS_PER_SEC;    printf("%u.%u secs\n", i / 10, i % 10);  }}

⌨️ 快捷键说明

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