亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
精品国产sm最大网站免费看| 久久精品久久综合| 国产69精品久久久久毛片| 精品99久久久久久| 国产毛片一区二区| 中文字幕日韩一区二区| 91亚洲男人天堂| 丝瓜av网站精品一区二区 | 久久久久国产精品麻豆ai换脸| 麻豆成人久久精品二区三区红 | 午夜成人免费视频| 欧美一二三四在线| 成人aa视频在线观看| 午夜精品国产更新| 国产精品天天摸av网| 欧美性色黄大片| 国产精品一区二区久激情瑜伽| 亚洲欧美日韩国产成人精品影院| 欧美三级资源在线| 国产精一区二区三区| 亚洲成人第一页| 99re视频精品| 日韩精品中午字幕| 97久久精品人人做人人爽50路| 视频一区中文字幕国产| 国产嫩草影院久久久久| 日韩亚洲欧美中文三级| 日本久久电影网| 粉嫩av一区二区三区粉嫩| 婷婷综合五月天| 亚洲自拍都市欧美小说| 亚洲综合免费观看高清完整版 | 国产一区美女在线| 麻豆精品久久久| 蜜臀av一级做a爰片久久| 亚洲精品水蜜桃| 亚洲成a天堂v人片| 亚洲一区二区三区在线播放| 亚洲免费在线电影| 亚洲女与黑人做爰| 亚洲一区二区三区四区在线| 亚洲午夜一二三区视频| 肉色丝袜一区二区| 久久精品国产一区二区三| 麻豆国产91在线播放| 国产成人亚洲综合a∨婷婷图片| 国模一区二区三区白浆| 国产精品一区二区在线播放 | 国产福利一区在线| 97se狠狠狠综合亚洲狠狠| 欧美在线免费观看亚洲| 欧美日韩成人高清| 国产清纯白嫩初高生在线观看91 | 亚洲第一搞黄网站| 蜜臀av性久久久久蜜臀aⅴ四虎| 精品一区二区三区在线播放视频| 成人免费视频播放| 日韩欧美综合在线| 一区二区三区四区不卡视频 | 国产精品综合久久| 欧美亚洲高清一区二区三区不卡| 91精品国产欧美一区二区| 国产三级精品视频| 日本伊人色综合网| 成人一区二区三区| 久久伊人蜜桃av一区二区| 一区二区在线观看免费| 国产jizzjizz一区二区| 精品日韩一区二区三区免费视频| 亚洲一二三四区不卡| 99精品热视频| 亚洲欧美日韩成人高清在线一区| 精品一区二区三区免费观看| 欧美视频一区二区三区四区| 中文字幕一区日韩精品欧美| 国产sm精品调教视频网站| 精品成人一区二区| 极品少妇xxxx偷拍精品少妇| 91精品国产综合久久国产大片| 一区二区三区在线影院| 欧洲精品在线观看| 中日韩免费视频中文字幕| 国产成人午夜电影网| 国产精品电影一区二区| 日本精品裸体写真集在线观看| 亚洲人成在线观看一区二区| 99热精品国产| 亚洲福利视频三区| 欧美乱熟臀69xxxxxx| 亚洲成年人网站在线观看| 日韩一区二区三区在线| 国产一区在线视频| 亚洲精品国产无天堂网2021| 日韩视频国产视频| 成人av在线资源网站| 石原莉奈在线亚洲二区| 中文字幕第一页久久| 欧美日韩在线播| 国产一区二区三区日韩| 一区二区三区欧美在线观看| 精品日韩av一区二区| 色综合久久综合网| 国产在线一区二区| 婷婷丁香激情综合| 自拍偷拍亚洲综合| 国产亚洲成av人在线观看导航| 欧美日韩国产综合一区二区三区 | 精品理论电影在线| 欧美在线免费播放| 91亚洲永久精品| 丁香婷婷综合色啪| 国产成人免费在线观看不卡| 亚洲图片欧美视频| 亚洲专区一二三| 亚洲欧美日韩国产综合在线| 国产精品无人区| 久久精品亚洲麻豆av一区二区 | 国产视频一区二区在线| 欧美变态口味重另类| 欧美一级片在线| 91精品国产色综合久久不卡电影 | 亚洲人成人一区二区在线观看| 久久精品亚洲麻豆av一区二区| 日韩一区二区三区高清免费看看| 欧美性猛交xxxx乱大交退制版 | 成人污视频在线观看| 国产 日韩 欧美大片| 99久久精品免费看| 欧美性xxxxx极品少妇| 欧美日韩一区二区三区视频| 欧美日韩卡一卡二| 欧美videos大乳护士334| 欧美精品一区二区三区在线| 国产欧美日产一区| 亚洲成人免费电影| 国产精品自拍毛片| 色婷婷av久久久久久久| 日韩视频一区二区| 亚洲精品久久久蜜桃| 午夜久久久久久| aaa亚洲精品一二三区| 欧美日韩一区不卡| 中文字幕精品综合| 狂野欧美性猛交blacked| 成人高清在线视频| 精品国产1区2区3区| 午夜精品久久久久久久久久久| 丁香婷婷综合激情五月色| 欧美日韩一区高清| 一区二区三区丝袜| 99久久精品免费看| 中文字幕一区二区三| 国产成人小视频| 久久精品欧美一区二区三区麻豆| 一区二区三区日韩在线观看| 91蜜桃在线观看| 最新中文字幕一区二区三区| 国产69精品久久99不卡| 国产拍揄自揄精品视频麻豆| 六月丁香婷婷久久| 在线播放视频一区| 美腿丝袜亚洲色图| 一区二区三区在线观看国产| 国产精品一区二区你懂的| 色嗨嗨av一区二区三区| 欧美精品久久99| 久久精品一区二区三区四区| 亚洲成va人在线观看| 日韩精品亚洲专区| 国产蜜臀av在线一区二区三区| 亚洲欧美电影院| 亚洲国产三级在线| 久久精品国产精品青草| 精品国产乱码久久久久久久久 | 最新成人av在线| 不卡电影一区二区三区| 一区二区三区**美女毛片| 欧美视频自拍偷拍| 久久精品国产77777蜜臀| 久久一区二区视频| 91免费精品国自产拍在线不卡| 亚洲精品国产成人久久av盗摄| 欧美美女一区二区| 99久久婷婷国产综合精品| 国产日韩欧美亚洲| 韩国一区二区三区| 国产精品免费久久久久| 91高清视频免费看| 国产91综合网| 黄色精品一二区| 亚洲高清视频在线| 亚洲激情图片qvod| 中文字幕不卡在线观看| 欧美xxxx老人做受| 制服.丝袜.亚洲.中文.综合| 99视频在线精品| 丁香天五香天堂综合| 国产成人午夜精品影院观看视频| 香蕉av福利精品导航| 亚洲影院久久精品|