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

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

?? tcp.c

?? arm環境下開發以太網的程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*********************************************************************
*
*                  TCP Module for Microchip TCP/IP Stack
*					Based on RFC 793
*
*********************************************************************
* FileName:        TCP.C
* Dependencies:    string.h
*                  StackTsk.h
*                  Helpers.h
*                  IP.h
*                  MAC.h
*                  ARP.h
*                  Tick.h
*                  TCP.h
* Processor:       PIC18, PIC24F, PIC24H, dsPIC30F, dsPIC33F
* Complier:        Microchip C18 v3.02 or higher
*					Microchip C30 v2.01 or higher
* Company:         Microchip Technology, Inc.
*
* Software License Agreement
*
* This software is owned by Microchip Technology Inc. ("Microchip") 
* and is supplied to you for use exclusively as described in the 
* associated software agreement.  This software is protected by 
* software and other intellectual property laws.  Any use in 
* violation of the software license may subject the user to criminal 
* sanctions as well as civil liability.  Copyright 2006 Microchip
* Technology Inc.  All rights reserved.
*
* This software is provided "AS IS."  MICROCHIP DISCLAIMS ALL 
* WARRANTIES, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, NOT LIMITED 
* TO MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND 
* INFRINGEMENT.  Microchip shall in no event be liable for special, 
* incidental, or consequential damages.
*
 *
 * Author               Date    Comment
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * Nilesh Rajbharti     5/8/01  Original        (Rev 1.0)
 * Nilesh Rajbharti     5/22/02 Rev 2.0 (See version.log for detail)
 * Nilesh Rajbharti     11/1/02 Fixed TCPTick() SYN Retry bug.
 * Nilesh Rajbharti     12/5/02	Modified TCPProcess()
 *                              to include localIP as third param.
 *                              This was done to allow this function
 *                              to calculate checksum correctly.
 * Roy Schofield		10/1/04	TCPConnect() startTick bug fix.
 * Howard Schlunder		1/3/05	Fixed HandleTCPSeg() unexpected 
 * 								discard problem identified by Richard
 *				 				Shelquist.
 * Howard Schlunder		1/16/06	Fixed an imporbable RX checksum bug 
 *								when using a Microchip Ethernet controller)
 * Howard Schlunder		5/10/06	Revised TCP state machine, add TCP_FIN_2
 * Howard Schlunder		8/01/06 Adjusted response to ACK only in TCP_SYN_SENT state
 * Howard Schlunder		8/03/06 Fixed checksum comparison check 
 *								reported by DouglasPunch on Microchip Forum.
 * Howard Schlunder		8/11/06 Fixed a resource leak causing MAC TX 
 *								Buffers to be obtained but not 
 *								released when many web requests were 
 *								received concurrently.
********************************************************************/
#define THIS_IS_TCP

#include <string.h>

#include "..\Include\StackTsk.h"
#include "..\Include\Helpers.h"
#include "..\Include\IP.h"
#include "..\Include\MAC.h"
#include "..\Include\Tick.h"
#include "..\Include\TCP.h"

#if defined(STACK_USE_TCP)

// Max TCP data length is MAC_TX_BUFFER_SIZE - sizeof(TCP_HEADER) -
// sizeof(IP_HEADER) - sizeof(ETHER_HEADER)
#define MAX_TCP_DATA_LEN		(MAC_TX_BUFFER_SIZE - 54)

// TCP Timeout value to begin with.
#define TCP_START_TIMEOUT_VAL   ((TICK)TICK_SECOND * (TICK)3)

// TCP Flags defined in RFC
#define FIN     (0x01)
#define SYN     (0x02)
#define RST     (0x04)
#define PSH     (0x08)
#define ACK     (0x10)
#define URG     (0x20)

// TCP Header
typedef struct _TCP_HEADER
{
	WORD    SourcePort;
	WORD    DestPort;
	DWORD   SeqNumber;
	DWORD   AckNumber;

	struct
	{
		unsigned char Reserved3      : 4;
		unsigned char Val            : 4;
	} DataOffset;

	union
	{
		struct
		{
			unsigned char flagFIN    : 1;
			unsigned char flagSYN    : 1;
			unsigned char flagRST    : 1;
			unsigned char flagPSH    : 1;
			unsigned char flagACK    : 1;
			unsigned char flagURG    : 1;
			unsigned char Reserved2  : 2;
		} bits;
		BYTE byte;
	} Flags;

	WORD    Window;
	WORD    Checksum;
	WORD    UrgentPointer;
} TCP_HEADER;

// TCP Options as defined by RFC
#define TCP_OPTIONS_END_OF_LIST     (0x00)
#define TCP_OPTIONS_NO_OP           (0x01)
#define TCP_OPTIONS_MAX_SEG_SIZE    (0x02)
typedef struct _TCP_OPTIONS
{
	BYTE        Kind;
	BYTE        Length;
	WORD_VAL    MaxSegSize;
} TCP_OPTIONS;

#define SwapPseudoTCPHeader(h)  (h.TCPLength = swaps(h.TCPLength))
// IP pseudo header as defined by RFC 793
typedef struct _PSEUDO_HEADER
{
	IP_ADDR SourceAddress;
	IP_ADDR DestAddress;
	BYTE Zero;
	BYTE Protocol;
	WORD TCPLength;
} PSEUDO_HEADER;

#define LOCAL_PORT_START_NUMBER (1024)
#define LOCAL_PORT_END_NUMBER   (5000)


// Local temp port numbers.
#ifdef STACK_CLIENT_MODE
static WORD _NextPort = LOCAL_PORT_START_NUMBER;
#endif

// The TCB array is very large.  With the C18 compiler, one must 
// modify the linker script to make an array that spans more than 
// one memory bank.  To do this, make the necessary changes to your 
// processor's linker script (.lkr).  Here is an example showing 
// gpr11 and 128 bytes of gpr12 being combined into one 384 byte 
// block used exclusively by the TCB_MEM data section:
// ...
// //DATABANK   NAME=gpr11      START=0xB00          END=0xBFF
// //DATABANK   NAME=gpr12      START=0xC00          END=0xCFF
// DATABANK   NAME=gpr11b     START=0xB00          END=0xC7F           PROTECTED
// DATABANK   NAME=gpr12      START=0xC80          END=0xCFF
// ...
// SECTION    NAME=TCB_MEM    RAM=gpr11b
// ...
#pragma udata TCB_MEM
SOCKET_INFO TCB[MAX_SOCKETS];
#pragma udata bla	// Return to any other RAM section

static void HandleTCPSeg(TCP_SOCKET s,
						 NODE_INFO *remote,
						 TCP_HEADER *h,
						 WORD len);

static void TransmitTCP(NODE_INFO *remote,
						TCP_PORT localPort,
						TCP_PORT remotePort,
						DWORD seq,
						DWORD ack,
						BYTE flags,
						BUFFER buffer,
						WORD len);

static TCP_SOCKET FindMatchingSocket(TCP_HEADER *h,
									 NODE_INFO *remote);
static void SwapTCPHeader(TCP_HEADER* header);
static void CloseSocket(SOCKET_INFO* ps);

#define SendTCP(remote, localPort, remotePort, seq, ack, flags)     \
	TransmitTCP(remote, localPort, remotePort, seq, ack, flags, \
	INVALID_BUFFER, 0)


/*********************************************************************
* Function:        void TCPInit(void)
*
* PreCondition:    None
*
* Input:           None
*
* Output:          TCP is initialized.
*
* Side Effects:    None
*
* Overview:        Initialize all socket states
*
* Note:            This function is called only once during lifetime
*                  of the application.
********************************************************************/
void TCPInit(void)
{
	TCP_SOCKET s;
	SOCKET_INFO* ps;

	// Initialize all sockets.
	for(s = 0; s < MAX_SOCKETS; s++)
	{
		ps = &TCB[s];

		ps->smState             = TCP_CLOSED;
		ps->Flags.bServer       = FALSE;
		ps->Flags.bIsPutReady   = TRUE;
		ps->Flags.bFirstRead    = TRUE;
		ps->Flags.bIsTxInProgress = FALSE;
		ps->Flags.bIsGetReady   = FALSE;
		if(ps->TxBuffer != INVALID_BUFFER)
		{
			MACDiscardTx(ps->TxBuffer);
			ps->TxBuffer        = INVALID_BUFFER;
		}
		ps->TimeOut             = TCP_START_TIMEOUT_VAL;
		ps->TxCount				= 0;
	}
}



/*********************************************************************
* Function:        TCP_SOCKET TCPListen(TCP_PORT port)
*
* PreCondition:    TCPInit() is already called.
*
* Input:           port    - A TCP port to be opened.
*
* Output:          Given port is opened and returned on success
*                  INVALID_SOCKET if no more sockets left.
*
* Side Effects:    None
*
* Overview:        None
*
* Note:            None
********************************************************************/
TCP_SOCKET TCPListen(TCP_PORT port)
{
	TCP_SOCKET s;
	SOCKET_INFO* ps;

	for(s = 0; s < MAX_SOCKETS; s++)
	{
		ps = &TCB[s];

		if(ps->smState == TCP_CLOSED)
		{
			// We have a CLOSED socket.
			// Initialize it with LISTENing state info.
			ps->smState             = TCP_LISTEN;
			ps->localPort           = port;
			ps->remotePort          = 0;

			// There is no remote node IP address info yet.
			ps->remote.IPAddr.Val   = 0x00;

			// If a socket is listened on, it is a SERVER.
			ps->Flags.bServer       = TRUE;

			ps->Flags.bIsGetReady   = FALSE;
			if(ps->TxBuffer != INVALID_BUFFER)
			{
				MACDiscardTx(ps->TxBuffer);
				ps->TxBuffer        = INVALID_BUFFER;
			}
			ps->Flags.bIsPutReady   = TRUE;

			return s;
		}
	}
	return INVALID_SOCKET;
}



/*********************************************************************
* Function:        TCP_SOCKET TCPConnect(NODE_INFO* remote,
*                                      TCP_PORT remotePort)
*
* PreCondition:    TCPInit() is already called.
*
* Input:           remote      - Remote node address info
*                  remotePort  - remote port to be connected.
*
* Output:          A new socket is created, connection request is
*                  sent and socket handle is returned.
*
* Side Effects:    None
*
* Overview:        None
*
* Note:            By default this function is not included in
*                  source.  You must define STACK_CLIENT_MODE to
*                  be able to use this function.
********************************************************************/
#ifdef STACK_CLIENT_MODE
TCP_SOCKET TCPConnect(NODE_INFO *remote, TCP_PORT remotePort)
{
	TCP_SOCKET s;
	SOCKET_INFO* ps;
	BOOL lbFound;


	lbFound = FALSE;

	// Find an available socket
	for(s = 0; s < MAX_SOCKETS; s++)
	{
		ps = &TCB[s];
		if(ps->smState == TCP_CLOSED)
		{
			lbFound = TRUE;
			break;
		}
	}

	// If there is no socket available, return error.
	if(!lbFound)
		return INVALID_SOCKET;

	// Each new socket that is opened by this node, gets
	// next sequential port number.
	ps->localPort = ++_NextPort;
	if(_NextPort >= LOCAL_PORT_END_NUMBER)
		_NextPort = LOCAL_PORT_START_NUMBER-1;

	// This is a client socket.
	ps->Flags.bServer = FALSE;

	// This is the port, we are trying to connect to.
	ps->remotePort = remotePort;

	// Each new socket that is opened by this node, will
	// start with next the next seqeuence number (essentially random)
	ps->SND_SEQ++;
	ps->SND_ACK = 0;

	memcpy((BYTE*)&ps->remote, (const void*)remote, sizeof(ps->remote));

	// Send SYN message.
	SendTCP(&ps->remote,
		ps->localPort,
		ps->remotePort,
		ps->SND_SEQ,
		ps->SND_ACK,
		SYN);

	ps->smState = TCP_SYN_SENT;
	ps->SND_SEQ++;

	// Allow TCPTick() to operate properly
	ps->startTick = TickGet(); 	

	return s;
}
#endif



/*********************************************************************
* Function:        BOOL TCPIsConnected(TCP_SOCKET s)
*
* PreCondition:    TCPInit() is already called.
*
* Input:           s       - Socket to be checked for connection.
*
* Output:          TRUE    if given socket is connected
*                  FALSE   if given socket is not connected.
*
* Side Effects:    None
*
* Overview:        None
*
* Note:            A socket is said to be connected if it is not
*                  in LISTEN and CLOSED mode.  Socket may be in
*                  SYN_RCVD or FIN_WAIT_1 and may contain socket
*                  data.
********************************************************************/
BOOL TCPIsConnected(TCP_SOCKET s)
{
	return (TCB[s].smState == TCP_ESTABLISHED);
}



/*********************************************************************
* Function:        void TCPDisconnect(TCP_SOCKET s)
*
* PreCondition:    TCPInit() is already called     AND
*                  TCPIsPutReady(s) == TRUE
*
* Input:           s       - Socket to be disconnected.
*
* Output:          A disconnect request is sent for given socket.
*
* Side Effects:    None
*
* Overview:        None
*
* Note:            None
********************************************************************/
void TCPDisconnect(TCP_SOCKET s)
{
	SOCKET_INFO *ps;

	ps = &TCB[s];

	// If socket is not connected, may be it is already closed
	// or in the process of closing.  Since we have called this
	// explicitly, close it forcefully.
	if(ps->smState != TCP_ESTABLISHED && ps->smState != TCP_SYN_RECEIVED)
	{
		CloseSocket(ps);
		return;
	}

	// Discard any outstanding data that is to be read.
	TCPDiscard(s);

	// Send FIN message.
	SendTCP(&ps->remote,
		ps->localPort,
		ps->remotePort,
		ps->SND_SEQ,
		ps->SND_ACK,
		FIN | ACK);
	DebugPrint(".");

	ps->SND_SEQ++;

	ps->smState = TCP_FIN_WAIT_1;

	return;
}

/*********************************************************************
* Function:        BOOL TCPFlush(TCP_SOCKET s)
*
* PreCondition:    TCPInit() is already called.
*
* Input:           s       - Socket whose data is to be transmitted.
*
* Output:          All and any data associated with this socket
*                  is marked as ready for transmission.
*
* Side Effects:    None
*
* Overview:        None
*
* Note:            None
********************************************************************/
BOOL TCPFlush(TCP_SOCKET s)
{
	SOCKET_INFO *ps;

	ps = &TCB[s];

	// Make sure that there is TxBuffer assigned to this socket.
	if ( ps->TxBuffer == INVALID_BUFFER )
		return FALSE;

	if ( ps->Flags.bIsPutReady == FALSE )
		return FALSE;

	TransmitTCP(&ps->remote,
		ps->localPort,
		ps->remotePort,
		ps->SND_SEQ,
		ps->SND_ACK,
		ACK + PSH,		// Use PSH to make sure the end application receives the data right away
		ps->TxBuffer,
		ps->TxCount);
	ps->SND_SEQ += (DWORD)ps->TxCount;
	ps->Flags.bIsPutReady       = FALSE;
	ps->Flags.bIsTxInProgress   = FALSE;

#ifdef TCP_NO_WAIT_FOR_ACK
	if(ps->TxBuffer != INVALID_BUFFER)
	{
		MACDiscardTx(ps->TxBuffer);
		ps->TxBuffer        = INVALID_BUFFER;
	}
	ps->Flags.bIsPutReady       = TRUE;
#endif

	return TRUE;
}



/*********************************************************************
* Function:        BOOL TCPIsPutReady(TCP_SOCKET s)
*
* PreCondition:    TCPInit() is already called.
*
* Input:           s       - socket to test
*
* Output:          TRUE if socket 's' is free to transmit
*                  FALSE if socket 's' is not free to transmit.
*
* Side Effects:    None
*
* Overview:        None
*
* Note:            Each socket maintains only transmit buffer.
*                  Hence until a data packet is acknowledeged by
*                  remote node, socket will not be ready for
*                  next transmission.
*                  All control transmission such as Connect,
*                  Disconnect do not consume/reserve any transmit
*                  buffer.
********************************************************************/
BOOL TCPIsPutReady(TCP_SOCKET s)
{
	if(TCB[s].RemoteWindow == 0)
		return FALSE;

	if ( TCB[s].TxBuffer == INVALID_BUFFER )
		return IPIsTxReady(FALSE);
	else
		return TCB[s].Flags.bIsPutReady;
}




/*********************************************************************
* Function:        BOOL TCPPut(TCP_SOCKET s, BYTE byte)
*
* PreCondition:    TCPIsPutReady() == TRUE
*
* Input:           s       - socket to use
*                  byte    - a data byte to send
*
* Output:          TRUE if given byte was put in transmit buffer
*                  FALSE if transmit buffer is full.
*
* Side Effects:    None
*
* Overview:        None
*
* Note:            None
********************************************************************/
BOOL TCPPut(TCP_SOCKET s, BYTE byte)
{
	SOCKET_INFO* ps;

	ps = &TCB[s];

	// Make sure that the remote node is able to accept our data
	if(ps->RemoteWindow == 0)
		return FALSE;

	if(ps->TxBuffer == INVALID_BUFFER)
	{
		ps->TxBuffer = MACGetTxBuffer(FALSE);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品国产网站| 91精品国产91久久综合桃花| 欧美精品日日鲁夜夜添| 中文字幕在线免费不卡| 国产 日韩 欧美大片| 精品视频一区 二区 三区| 亚洲丝袜精品丝袜在线| 岛国一区二区三区| 久久久久久久久一| 青青青爽久久午夜综合久久午夜| 欧美亚洲日本国产| 亚洲激情在线播放| 91福利视频网站| 亚洲欧美日韩在线| 国产经典欧美精品| 国产精品理论片| 一本色道亚洲精品aⅴ| 亚洲摸摸操操av| 国产盗摄精品一区二区三区在线| 国产三级一区二区三区| 国产福利一区二区三区视频在线 | 日韩电影在线看| 91高清在线观看| 日韩福利电影在线| 精品国产自在久精品国产| 国产一区二区不卡老阿姨| 国产亚洲成年网址在线观看| 国产九色精品成人porny| 久久久久久久久久久电影| 国产69精品久久久久毛片| 亚洲免费伊人电影| 91免费视频网| 午夜激情综合网| 日韩精品一区二区三区在线观看 | 国产呦萝稀缺另类资源| 久久久久久久久久久99999| 国产成人8x视频一区二区| 亚洲欧美电影院| 欧美午夜视频网站| 久久精品国产亚洲a| 中文字幕av一区二区三区| 在线亚洲一区二区| 亚洲一区二区在线播放相泽| 日韩精品在线看片z| 国产精品99久久久久久似苏梦涵| 中文字幕综合网| 日韩午夜在线观看| 成人蜜臀av电影| 偷拍亚洲欧洲综合| 日韩欧美电影一区| 99re成人精品视频| 欧美aaa在线| 久久久高清一区二区三区| 色中色一区二区| 久久国产福利国产秒拍| 亚洲激情欧美激情| 欧美男男青年gay1069videost | 亚洲精品一二三四区| 91精品中文字幕一区二区三区| 国产在线精品免费| 亚洲福中文字幕伊人影院| 欧美理论电影在线| 成人高清免费观看| 卡一卡二国产精品| 中文字幕电影一区| 91视频免费观看| 国产精品123| 国产酒店精品激情| 国产一区二区三区电影在线观看 | 日韩欧美一级在线播放| 欧美四级电影网| 日本高清免费不卡视频| av色综合久久天堂av综合| 国产成a人亚洲精品| 国产精品资源在线观看| 激情六月婷婷久久| 久久国产福利国产秒拍| 精品影院一区二区久久久| 日韩国产精品久久久| 日日欢夜夜爽一区| 午夜视频在线观看一区| 午夜天堂影视香蕉久久| 日本视频免费一区| 日本欧美肥老太交大片| 日本91福利区| 国内外成人在线| 国产精品18久久久久久久久久久久 | 韩国毛片一区二区三区| 免费成人av资源网| 精品亚洲欧美一区| 国产精品亚洲人在线观看| 国产乱一区二区| 不卡欧美aaaaa| 91免费视频大全| 色94色欧美sute亚洲13| 欧美亚洲国产bt| 91麻豆精品国产综合久久久久久| 欧美高清激情brazzers| 欧美一卡二卡三卡| 久久亚洲二区三区| 亚洲国产成人私人影院tom| **网站欧美大片在线观看| 亚洲精品视频在线观看网站| 亚洲福利视频导航| 老司机精品视频导航| 国产精品正在播放| 成人国产免费视频| 欧美日韩中文国产| 日韩三级中文字幕| 国产欧美日韩一区二区三区在线观看| 中文字幕在线不卡一区| 午夜视频在线观看一区| 国产一区二区三区四区五区入口| av一本久道久久综合久久鬼色| 在线观看日韩毛片| 日韩美女一区二区三区| 国产精品蜜臀在线观看| 亚洲超碰精品一区二区| 国产一区二区精品久久| 91麻豆国产精品久久| 91麻豆精品国产91久久久使用方法 | 欧美精品123区| 亚洲国产高清aⅴ视频| 亚洲国产精品久久艾草纯爱| 狠狠色丁香久久婷婷综合_中 | 国产精品婷婷午夜在线观看| 一区二区三区四区不卡在线 | 国产精品久久久久影视| 亚洲国产成人av| 春色校园综合激情亚洲| 欧美日韩亚洲综合在线 | 亚洲综合在线视频| 九九九精品视频| 91黄色激情网站| 国产亚洲成年网址在线观看| 日韩成人免费在线| 成人av在线一区二区| 日韩欧美区一区二| 洋洋成人永久网站入口| 国产aⅴ综合色| 日韩亚洲欧美一区| 一区二区三区在线视频播放| 激情综合五月天| 91视视频在线直接观看在线看网页在线看| 欧美一区二区三级| 亚洲欧美电影一区二区| 激情偷乱视频一区二区三区| 一本色道久久综合亚洲精品按摩| 欧美v国产在线一区二区三区| 国产精品久久福利| 久久99最新地址| 欧美肥大bbwbbw高潮| 奇米色777欧美一区二区| 日韩欧美不卡在线观看视频| 成人网在线播放| 国产精品久久综合| 丰满少妇在线播放bd日韩电影| 成人18视频日本| 亚洲国产精品成人久久综合一区| 欧美激情在线观看视频免费| 中文字幕精品—区二区四季| 国产精品伦理一区二区| 国产欧美视频在线观看| 亚洲欧美日韩一区二区 | 久久爱www久久做| 日韩限制级电影在线观看| 国产精品亚洲综合一区在线观看| 一个色综合av| 亚洲国产日韩av| 天堂一区二区在线免费观看| 亚洲激情图片qvod| 成人在线综合网| 国产精品一级黄| 日韩一区二区电影在线| 久久综合九色综合97_久久久| 亚洲综合一二区| 91天堂素人约啪| 久久久亚洲综合| 精品综合久久久久久8888| 91社区在线播放| 欧美激情一区二区三区四区| 经典一区二区三区| 欧美草草影院在线视频| 蜜桃在线一区二区三区| 欧美综合一区二区| 91.成人天堂一区| 久久尤物电影视频在线观看| 亚洲综合视频在线| 日本美女一区二区| 风间由美一区二区av101| 欧美性视频一区二区三区| 欧美一级艳片视频免费观看| 欧美日本精品一区二区三区| 欧美理论电影在线| 中文字幕制服丝袜一区二区三区| 日欧美一区二区| 国产一区三区三区| 国产99久久久国产精品潘金网站| 久久久蜜臀国产一区二区| 国产精品乱子久久久久|