📄 tcpabort.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 + -