亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tcpip.c

?? 單片機開發儀態網通訊用的用的TCP/IP程序包
?? C
?? 第 1 頁 / 共 4 頁
字號:
//------------------------------------------------------------------------------
// Name: tcpip.c
// Func: implements the TCP/IP-stack and provides an API
// Ver.: 1.1
// Date: January 2004
// Auth: Andreas Dannenberg
//       MSP430 Applications
//       Texas Instruments Inc.
// Rem.: -
//------------------------------------------------------------------------------

#include "msp430x14x.h"
#include "support.h"
#include "cs8900.h"
#include "tcpip.h"

// constants
const unsigned int MyIP[] =                      // "MYIP1.MYIP2.MYIP3.MYIP4"
{
  MYIP_1 + (unsigned int)(MYIP_2 << 8),
  MYIP_3 + (unsigned int)(MYIP_4 << 8)
};

const unsigned int SubnetMask[] =                // "SUBMASK1.SUBMASK2.SUBMASK3.SUBMASK4"
{
  SUBMASK_1 + (unsigned int)(SUBMASK_2 << 8),
  SUBMASK_3 + (unsigned int)(SUBMASK_4 << 8)
};

const unsigned int GatewayIP[] =                 // "GWIP1.GWIP2.GWIP3.GWIP4"
{
  GWIP_1 + (unsigned int)(GWIP_2 << 8),
  GWIP_3 + (unsigned int)(GWIP_4 << 8)
};

// variables
static TTCPStateMachine TCPStateMachine;         // perhaps the most important var at all ;-)
static TLastFrameSent LastFrameSent;             // retransmission type

static unsigned int ISNGenHigh;                  // upper word of our Initial Sequence Number
static unsigned long TCPSeqNr;                   // next sequence number to send
static unsigned long TCPUNASeqNr;                // last unaknowledged sequence number
                                                 // incremented AFTER sending data
static unsigned long TCPAckNr;                   // next seq to receive and ack to send
                                                 // incremented AFTER receiving data
static unsigned char TCPTimer;                   // inc'd each 262ms
static unsigned char RetryCounter;               // nr. of retransmissions

static unsigned int TxFrame1Size;                // bytes to send in TxFrame1
static unsigned char TxFrame2Size;               // bytes to send in TxFrame2
static unsigned char TransmitControl;
static unsigned char TCPFlags;
unsigned int TCPRxDataCount;                     // nr. of bytes rec'd
unsigned int TCPTxDataCount;                     // nr. of bytes to send
unsigned int TCPLocalPort;                       // TCP ports
unsigned int TCPRemotePort;
unsigned int RemoteMAC[3];                       // MAC and IP of current TCP-session
unsigned int RemoteIP[2];
unsigned char SocketStatus;

// properties of the just received frame
static unsigned int RecdFrameLength;             // CS8900 reported frame length
static unsigned int RecdFrameMAC[3];             // 48 bit MAC
static unsigned int RecdFrameIP[2];              // 32 bit IP
static unsigned int RecdIPFrameLength;           // 16 bit IP packet length

// the next 3 buffers must be word-aligned!
unsigned int TxFrame1Mem[(ETH_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE +
                          MAX_TCP_TX_DATA_SIZE + 1) >> 1];
static unsigned int TxFrame2Mem[(ETH_HEADER_SIZE + MAX_ETH_TX_DATA_SIZE + 1) >> 1];
unsigned int RxTCPBufferMem[(MAX_TCP_RX_DATA_SIZE + 1) >> 1];  // space for incoming TCP-data
//------------------------------------------------------------------------------
// Handlers for incoming frames
static void ProcessEthBroadcastFrame(void);
static void ProcessEthIAFrame(void);
static void ProcessICMPFrame(void);
static void ProcessTCPFrame(void);

// fill TX-buffers
static void PrepareARP_REQUEST(void);
static void PrepareARP_ANSWER(void);
static void PrepareICMP_ECHO_REPLY(void);

static void PrepareTCP_FRAME(unsigned long seqnr, unsigned long acknr,
  unsigned int TCPCode);
static void PrepareTCP_DATA_FRAME(void);

// general help functions
static void TCPStartRetryTimer(void);
static void TCPStartFinTimer(void);
static void TCPRestartTimer(void);
static void TCPStopTimer(void);
static void TCPHandleRetransmission(void);
static void TCPHandleTimeout(void);
static unsigned int CalcChecksum(void *Start, unsigned int Count,
  unsigned char IsTCP);
//------------------------------------------------------------------------------
// easyWEB-API function
// initalizes the LAN-controller, reset flags, starts timer-ISR
//------------------------------------------------------------------------------
void TCPLowLevelInit(void)
{
  BCSCTL1 &= ~DIVA0;                             // ACLK = XT1 / 4 = 2 MHz
  BCSCTL1 |= DIVA1;
  TACTL = ID_3 + TASSEL_1 + MC_2 + TAIE;         // stop timer, use ACLK / 8 = 250 kHz, gen. int.
                                                 // start timer in continuous up-mode
  Init8900();
  TransmitControl = 0;
  TCPFlags = 0;
  TCPStateMachine = CLOSED;
  SocketStatus = 0;
}
//------------------------------------------------------------------------------
// easyWEB-API function
// does a passive open (listen on 'MyIP:TCPLocalPort' for an incoming
// connection)
//------------------------------------------------------------------------------
void TCPPassiveOpen(void)
{
  if (TCPStateMachine == CLOSED)
  {
    TCPFlags &= ~TCP_ACTIVE_OPEN;                // let's do a passive open!
    TCPStateMachine = LISTENING;
    SocketStatus = SOCK_ACTIVE;                  // reset, socket now active
  }
}
//------------------------------------------------------------------------------
// easyWEB-API function
// does an active open (tries to establish a connection between
// 'MyIP:TCPLocalPort' and 'RemoteIP:TCPRemotePort')
//------------------------------------------------------------------------------
void TCPActiveOpen(void)
{
  if ((TCPStateMachine == CLOSED) || (TCPStateMachine == LISTENING))
  {
    TCPFlags |= TCP_ACTIVE_OPEN;                 // let's do an active open!
    TCPFlags &= ~IP_ADDR_RESOLVED;               // we haven't opponents MAC yet
  
    PrepareARP_REQUEST();                        // ask for MAC by sending a broadcast
    LastFrameSent = ARP_REQUEST;
    TCPStartRetryTimer();
    SocketStatus = SOCK_ACTIVE;                  // reset, socket now active    
  }
}
//------------------------------------------------------------------------------
// easyWEB-API function
// closes an open connection
//------------------------------------------------------------------------------
void TCPClose(void)
{
  switch (TCPStateMachine)
  {
    case LISTENING :
    case SYN_SENT :
      TCPStateMachine = CLOSED;
      TCPFlags = 0;
      SocketStatus = 0;
      break;
    case SYN_RECD :
    case ESTABLISHED :
      TCPFlags |= TCP_CLOSE_REQUESTED;
      break;
  }
}
//------------------------------------------------------------------------------
// easyWEB-API function
// releases the receive-buffer and allows easyWEB to store new data
// NOTE: rx-buffer MUST be released periodically, else the other TCP
//       get no ACKs for the data it sent
//------------------------------------------------------------------------------
void TCPReleaseRxBuffer(void)
{
  SocketStatus &= ~SOCK_DATA_AVAILABLE;
}
//------------------------------------------------------------------------------
// easyWEB-API function
// transmitts data stored in 'TCP_TX_BUF'
// NOTE: * number of bytes to transmit must have been written to 'TCPTxDataCount'
//       * data-count MUST NOT exceed 'MAX_TCP_TX_DATA_SIZE'
//------------------------------------------------------------------------------
void TCPTransmitTxBuffer(void)
{
  if ((TCPStateMachine == ESTABLISHED) || (TCPStateMachine == CLOSE_WAIT))
    if (SocketStatus & SOCK_TX_BUF_RELEASED)
    {
      SocketStatus &= ~SOCK_TX_BUF_RELEASED;               // occupy tx-buffer
      TCPUNASeqNr += TCPTxDataCount;                       // advance UNA
      
      TxFrame1Size = ETH_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE + TCPTxDataCount;
      TransmitControl |= SEND_FRAME1;
      
      LastFrameSent = TCP_DATA_FRAME;
      TCPStartRetryTimer();
    }
}
//------------------------------------------------------------------------------
// easyWEB's 'main()'-function
// must be called from user program periodically (the often - the better)
// handles network, TCP/IP-stack and user events
//------------------------------------------------------------------------------
void DoNetworkStuff(void)
{
  unsigned int ActRxEvent;                       // copy of cs8900's RxEvent-Register

  Write8900(ADD_PORT, PP_RxEvent);               // point to RxEvent
  ActRxEvent = Read8900(DATA_PORT);              // read, implied skip of last frame

  if (ActRxEvent & RX_OK)
  {
    if (ActRxEvent & RX_IA) ProcessEthIAFrame();
    if (ActRxEvent & RX_BROADCAST) ProcessEthBroadcastFrame();
  }

  if (TCPFlags & TCP_TIMER_RUNNING)
    if (TCPFlags & TIMER_TYPE_RETRY)
    {
      if (TCPTimer > RETRY_TIMEOUT)
      {
        TCPRestartTimer();                       // set a new timeout

        if (RetryCounter)
        {
          TCPHandleRetransmission();             // resend last frame
          RetryCounter--;
        }
        else
        {
          TCPStopTimer();
          TCPHandleTimeout();
        }
      }
    }
    else if (TCPTimer > FIN_TIMEOUT)
    {
      TCPStateMachine = CLOSED;
      TCPFlags = 0;                              // reset all flags, stop retransmission...
      SocketStatus &= SOCK_DATA_AVAILABLE;       // clear all flags but data available
    }

  switch (TCPStateMachine)
  {
    case CLOSED :
    case LISTENING :
      if (TCPFlags & TCP_ACTIVE_OPEN)            // stack has to open a connection?
        if (TCPFlags & IP_ADDR_RESOLVED)         // IP resolved?
          if (!(TransmitControl & SEND_FRAME2))  // buffer free?
          {
            TCPSeqNr = ((unsigned long)ISNGenHigh << 16) | TAR; // set local ISN
            TCPUNASeqNr = TCPSeqNr;
            TCPAckNr = 0;                                       // we don't know what to ACK!
            TCPUNASeqNr++;                                      // count SYN as a byte
            PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, TCP_CODE_SYN); // send SYN frame
            LastFrameSent = TCP_SYN_FRAME;
            TCPStartRetryTimer();                               // we NEED a retry-timeout
            TCPStateMachine = SYN_SENT;
          }
      break;
    case SYN_RECD :
    case ESTABLISHED :
      if (TCPFlags & TCP_CLOSE_REQUESTED)                  // user has user initated a close?
        if (!(TransmitControl & (SEND_FRAME2 | SEND_FRAME1)))   // buffers free?
          if (TCPSeqNr == TCPUNASeqNr)                          // all data ACKed?
          {
            TCPUNASeqNr++;
            PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, TCP_CODE_FIN | TCP_CODE_ACK);
            LastFrameSent = TCP_FIN_FRAME;
            TCPStartRetryTimer();
            TCPStateMachine = FIN_WAIT_1;
          }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品毛片久久久久久久| 久久免费的精品国产v∧| www.色综合.com| 国产精品一级片在线观看| 极品少妇一区二区三区精品视频| 亚洲成精国产精品女| 日韩和欧美一区二区| 亚洲成a人v欧美综合天堂| 亚洲综合一区在线| 亚洲电影第三页| 久久精品国产在热久久| 国产曰批免费观看久久久| 国产高清不卡一区二区| 丰满放荡岳乱妇91ww| 成人av电影观看| 日本黄色一区二区| 欧美一区二区三区思思人| 久久精品视频在线看| 亚洲日本乱码在线观看| 一级精品视频在线观看宜春院 | 久久久精品天堂| 国产精品视频一区二区三区不卡| 亚洲精品日韩专区silk | 91精品国产91久久久久久一区二区| 欧美日韩高清一区二区不卡| 日韩一区二区在线看| 国产欧美日韩精品a在线观看| 亚洲人成小说网站色在线 | 亚洲综合视频在线观看| 蜜臀精品一区二区三区在线观看| 国产.欧美.日韩| 欧美日韩国产高清一区| 欧美激情一区二区三区全黄| 樱花草国产18久久久久| 黑人巨大精品欧美一区| 91久久精品一区二区三区| 91精品国产91久久久久久一区二区| 国产日韩欧美不卡| 水蜜桃久久夜色精品一区的特点| 国产一区免费电影| 欧美久久久久免费| 亚洲精品自拍动漫在线| 精品写真视频在线观看| 欧美日韩国产色站一区二区三区| 久久久777精品电影网影网| 亚洲国产日韩综合久久精品| 国产suv精品一区二区883| 337p亚洲精品色噜噜噜| 亚洲欧美乱综合| 国产精品自产自拍| 日韩欧美中文一区二区| 夜色激情一区二区| jlzzjlzz亚洲日本少妇| 精品国产电影一区二区| 日韩和欧美的一区| 欧洲国产伦久久久久久久| 国产亚洲欧美日韩日本| 美女一区二区在线观看| 欧美日韩精品免费| 亚洲一区在线观看免费观看电影高清 | 欧美性大战久久久久久久| 国产精品女人毛片| 国产乱妇无码大片在线观看| 91精品国产一区二区三区香蕉| 亚洲欧美色图小说| 99精品视频一区二区| 欧美国产精品v| 国产成人av影院| 久久综合色鬼综合色| 极品尤物av久久免费看| 欧美电视剧免费观看| 裸体一区二区三区| 日韩欧美的一区二区| 青草av.久久免费一区| 91精品国产综合久久精品| 日本不卡视频一二三区| 91精品国产一区二区| 久久狠狠亚洲综合| 久久久综合视频| a亚洲天堂av| 亚洲欧美成人一区二区三区| 91麻豆精品在线观看| 亚洲综合免费观看高清完整版 | 日韩一区二区在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美一级黄色大片| 国产激情精品久久久第一区二区| 日本一区二区三区高清不卡| 99精品国产热久久91蜜凸| 一区二区三区四区激情| 欧美精品丝袜中出| 久久99精品国产麻豆婷婷洗澡| 26uuu精品一区二区| 91污片在线观看| 亚欧色一区w666天堂| 欧美mv日韩mv| 99re这里都是精品| 日本最新不卡在线| 中文一区在线播放| 欧美日韩精品一区二区天天拍小说| 午夜av区久久| 国产午夜精品一区二区三区四区| 91一区二区在线观看| 日韩精品乱码免费| 国产欧美日韩综合精品一区二区| 日本高清无吗v一区| 蜜臀久久99精品久久久久宅男| 久久精品免视看| 欧美在线影院一区二区| 精品一区二区三区免费毛片爱 | 欧美日韩精品一区二区三区蜜桃| 蜜桃免费网站一区二区三区| 中文字幕五月欧美| 精品欧美久久久| 欧美三区免费完整视频在线观看| 毛片一区二区三区| 亚洲欧美日韩在线播放| 久久久天堂av| 91.成人天堂一区| 波多野结衣中文字幕一区| 午夜不卡在线视频| 亚洲欧美日韩国产成人精品影院 | 精品国产精品网麻豆系列| 色噜噜偷拍精品综合在线| 激情成人综合网| 亚洲高清在线精品| 亚洲欧美一区二区三区极速播放 | 日韩一区二区免费在线电影| 99精品久久99久久久久| 久久精品国产精品青草| 亚洲一区二区三区在线| 国产精品传媒在线| 久久精品综合网| 精品国产伦一区二区三区观看方式 | 五月综合激情网| 国产精品成人免费在线| 久久青草国产手机看片福利盒子| 欧美日韩高清不卡| 欧美日韩你懂的| 在线观看一区二区视频| 一本色道久久综合亚洲aⅴ蜜桃| 国产成人av网站| 精品一区二区三区的国产在线播放| 亚洲h精品动漫在线观看| **欧美大码日韩| 中文字幕一区二区三区在线观看| 久久久蜜桃精品| 久久亚洲一区二区三区四区| 欧美一区二区在线观看| 欧美一区在线视频| 欧美一区二区三区在线观看视频| 欧美精品第一页| 日韩丝袜美女视频| 欧美一区二区三区在线电影| 欧美一区二区三区四区久久| 精品免费国产二区三区| 精品成a人在线观看| 久久夜色精品一区| 国产精品女人毛片| 一区二区三区中文在线观看| 亚洲妇女屁股眼交7| 婷婷国产v国产偷v亚洲高清| 日本不卡一区二区三区高清视频| 精品在线观看视频| 国产99精品视频| 99久久亚洲一区二区三区青草| 99久久婷婷国产综合精品电影| 在线视频中文字幕一区二区| 欧美色欧美亚洲另类二区| 91精品免费观看| 国产亚洲欧美在线| 亚洲精品一二三| 琪琪一区二区三区| 国产不卡免费视频| 欧美午夜影院一区| 欧美一区日韩一区| 亚洲国产精品成人综合| 夜夜操天天操亚洲| 麻豆91在线观看| voyeur盗摄精品| 欧美一级淫片007| 国产精品国产a| 全国精品久久少妇| 不卡av电影在线播放| 91麻豆精品国产自产在线| 精品国产乱码久久久久久牛牛| 成人欧美一区二区三区1314| 天天影视网天天综合色在线播放 | **性色生活片久久毛片| 热久久久久久久| 色综合久久中文综合久久97| 日韩一区二区三区精品视频| 国产精品九色蝌蚪自拍| 乱中年女人伦av一区二区| 99精品国产99久久久久久白柏| 欧美高清dvd| 一区二区三区四区蜜桃| 国产福利精品一区| 日韩欧美在线1卡| 亚洲精品第1页|