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

📄 tcpip.c

📁 这是本人以前用C51做的TCP/IP协议,也是借鉴了一些前辈的东西,,,,绝对可用!
💻 C
📖 第 1 页 / 共 5 页
字号:
		k = (u_char)((port & 0xff00) >> 8);
		*(SRC_PORT_PTR(s)) = k;
		k = (u_char)(port & 0x00ff);
		*(SRC_PORT_PTR(s) + 1) = k;

               //	k = (u_char)((port & 0xff00) >> 8);
		*(DST_PORT_PTR(s)) = 0x03;
	//	k = (u_char)(port & 0x00ff);
		*(DST_PORT_PTR(s) + 1) = 0xe8;
	}
	else                                              // Designate random port number which is managed by local when you didn't designate source port
	{
		Local_Port;
		*SRC_PORT_PTR(s) = (u_char)((Local_Port & 0xff00) >> 8);
		*(SRC_PORT_PTR(s) + 1) = (u_char)(Local_Port & 0x00ff);
	}

	I_STATUS[s] = 0;
	COMMAND(s) = CSOCK_INIT;
        /////06-03-29
       while(cc--)
        {
          // while (I_STATUS[s] != 0x02)
          if(cc==2)
             {tcpinitfg=1;
             }
            if(I_STATUS[s] != 0x02)
            {
             checkint1();
            _nop_();

            }
            else
               cc=0;
         }
//        while(cc--) //(cc--)
//        {  if(I_STATUS[s] != 0)
 //                 break;

                 	//while (I_STATUS[s] == 0);                         // Waiting Interrupt to CSOCK_INIT
//        }
        //
	if (!(I_STATUS[s] & SSOCK_INIT_OK)) return (-1);  // Error

	initseqnum(s);                                    // Use initial seq# with random number

	return	(s);
}




void NBlisten(SOCKET s) reentrant
{     //  _nop_();
      //  _nop_();
	I_STATUS[s] = 0;
     //   _nop_();
     //   _nop_();
	COMMAND(s) = CLISTEN;         // LISTEN
}

void initseqnum(SOCKET s) reentrant
{
	int i;
	i=i;
	i = s;
	SEQ_NUM.lVal++;     // Designate initial seq#
                            // If you have random number generation function, assign random number instead of SEQ_NUM.lVal++.

	*(TX_WR_PTR(s) + 0) = SEQ_NUM.cVal[3];
	*(TX_WR_PTR(s) + 1) = SEQ_NUM.cVal[2];
        _nop_();

	*(TX_WR_PTR(s) + 2) = SEQ_NUM.cVal[1];
        _nop_();
	*(TX_WR_PTR(s) + 3) = SEQ_NUM.cVal[0];
        delay(10);
	 // Wait until TX_WR_PRT has been written safely. ( Must have delay(1.6us) if next action is to write 4byte-pointer register )


	*(TX_RD_PTR(s) + 0) = SEQ_NUM.cVal[3];
	*(TX_RD_PTR(s) + 1) = SEQ_NUM.cVal[2];
	*(TX_RD_PTR(s) + 2) = SEQ_NUM.cVal[1];
	*(TX_RD_PTR(s) + 3) = SEQ_NUM.cVal[0];
	delay(10);
	*(TX_ACK_PTR(s) + 0) = SEQ_NUM.cVal[3];
	*(TX_ACK_PTR(s) + 1) = SEQ_NUM.cVal[2];
	*(TX_ACK_PTR(s) + 2) = SEQ_NUM.cVal[1];
	*(TX_ACK_PTR(s) + 3) = SEQ_NUM.cVal[0];
        delay(10);
}


int send(SOCKET s, u_char * buf, u_int len) reentrant
{
	int ptr, size;
     //  len=100;
	if (len <= 0) return (0);
	else
	{
		ptr = 0;
		do {
			size = send_in(s, buf + ptr, len);
			if (size == -1) return -1;
			len = len - size;
			ptr += size;
		} while ( len > 0);
	}

	return ptr;
}


int send_in(SOCKET s, u_char  * buf, u_int len) reentrant
{
	u_char k;
	int size;
	un_l2cval wr_ptr, ack_ptr;
	u_char * send_ptr;

        k = k;
     //    size=len;
    //    goto okstart;

S_START:
        Int7_Ds();
	k = *SHADOW_TXWR_PTR(s);
        delay(10) ;

	wr_ptr.cVal[0] = *(TX_WR_PTR(s) + 0);
	wr_ptr.cVal[1] = *(TX_WR_PTR(s) + 1);
	wr_ptr.cVal[2] = *(TX_WR_PTR(s) + 2);
	wr_ptr.cVal[3] = *(TX_WR_PTR(s) + 3);

	k = *SHADOW_TXACK_PTR(s);
	delay(10) ;
	ack_ptr.cVal[0] = *(TX_ACK_PTR(s) + 0);
	ack_ptr.cVal[1] = *(TX_ACK_PTR(s) + 1);
	ack_ptr.cVal[2] = *(TX_ACK_PTR(s) + 2);
	ack_ptr.cVal[3] = *(TX_ACK_PTR(s) + 3);
//	Int7_En();

	// Calculate send free buffer size
	if (wr_ptr.lVal >= ack_ptr.lVal) size = SSIZE[s] - (wr_ptr.lVal - ack_ptr.lVal);
	else size = SSIZE[s] - (0 - ack_ptr.lVal + wr_ptr.lVal);


	if (size > SSIZE[s])                                                            // Recalulate after some delay because of error in pointer caluation
	{
		if (select(s, SEL_CONTROL) != SOCK_ESTABLISHED) return -1;              // Error

		delay(200) ;

	//	goto S_START;
	}

	if (size == 0)                                                                  // Wait when previous sending has not finished yet and there's no free buffer
	{
		if (select(s, SEL_CONTROL) != SOCK_ESTABLISHED) return -1;              // Error
		delay(200) ;
	//	goto S_START;
	}

	else if (size < len)	len = size;
        //  okstart:
        // if (size < len)	len = size;
	send_ptr = (u_char *)( SBUFBASEADDRESS[s] + (UINT)(wr_ptr.lVal & SMASK[s]));    // Calculate pointer to data copy
	write_data(s, buf, send_ptr, len);                                              // data copy

	while (COMMAND(s) & CSEND)                                                      // Confirm send command
		if (select(s, SEL_CONTROL) != SOCK_ESTABLISHED) return -1;                  // Error

	wr_ptr.lVal = wr_ptr.lVal + len;                                                // tx_wr_ptr update
	*(TX_WR_PTR(s) + 0) = wr_ptr.cVal[0];
	*(TX_WR_PTR(s) + 1) = wr_ptr.cVal[1];
	*(TX_WR_PTR(s) + 2) = wr_ptr.cVal[2];
	*(TX_WR_PTR(s) + 3) = wr_ptr.cVal[3];

	COMMAND(s) = CSEND;                                                             // SEND

    return	(len);
}


int recv(SOCKET s, u_char  *buf, u_int len) reentrant
{
	u_char k;


	u_int size;
	un_l2cval wr_ptr, rd_ptr;
	u_char * recv_ptr;

R_START:
	Int7_Ds();
	k = *SHADOW_RXWR_PTR(s);   	// Must read the shadow register for reading 4byte pointer registers
	                   // wait for reading 4byte pointer registers safely
        delay(10);
	wr_ptr.cVal[0] = *(RX_WR_PTR(s) + 0);
	wr_ptr.cVal[1] = *(RX_WR_PTR(s) + 1);
	wr_ptr.cVal[2] = *(RX_WR_PTR(s) + 2);
	wr_ptr.cVal[3] = *(RX_WR_PTR(s) + 3);
	k = k;

	k = *SHADOW_RXRD_PTR(s);        // Must read the shadow register for reading 4byte pointer registers
//	                  // wait for reading 4byte pointer registers safely
        delay(10);
	rd_ptr.cVal[0] = *(RX_RD_PTR(s) + 0);
	rd_ptr.cVal[1] = *(RX_RD_PTR(s) + 1);
	rd_ptr.cVal[2] = *(RX_RD_PTR(s) + 2);
	rd_ptr.cVal[3] = *(RX_RD_PTR(s) + 3);
//	Int7_En();

	// calculate received data size
	if ( len <= 0 ) return (0);
	else if (wr_ptr.lVal >= rd_ptr.lVal)
             {
              size = wr_ptr.lVal - rd_ptr.lVal;
              }
	else size = 0 - rd_ptr.lVal + wr_ptr.lVal;

	if (size < len)                                                                 // Wait until receiving is done when received data size is less then len
	{
		if (select(s, SEL_CONTROL) != SOCK_ESTABLISHED) return -1;              // Error
		delay(200) ;
	//	goto R_START;
	}

	recv_ptr = (u_char *) (RBUFBASEADDRESS[s] + (UINT)(rd_ptr.lVal & RMASK[s]));    // Calculate pointer to be copied received data
        s=0;
	read_data(s, recv_ptr, buf, len);                                               // Copy receibed data

	rd_ptr.lVal += len;                                                             // Update rx_rd_ptr

	*(RX_RD_PTR(s) + 0) = rd_ptr.cVal[0];
	*(RX_RD_PTR(s) + 1) = rd_ptr.cVal[1];
	*(RX_RD_PTR(s) + 2) = rd_ptr.cVal[2];
	*(RX_RD_PTR(s) + 3) = rd_ptr.cVal[3];


	COMMAND(s) = CRECV;                                                             // RECV

    return	(len);
}

void close(SOCKET s) reentrant
{
	u_int len=0;
        u_int cc;
        cc=2000;
	if (select(s, SEL_CONTROL) == SOCK_CLOSED) return;	   // Already closed
	// When closing, if there's data which have not processed, Insert some source codes to handle this
	// Or before application call close(), handle those data first and call close() later.


//	len = select(s, SEL_SEND);
//	if (len == SSIZE[s])
//	{
		I_STATUS[s] =0;
		COMMAND(s) = CCLOSE;
             //   delay(10) ;
        while(cc--)
        {
          if(cc==2)
             {tcpinitfg=1;
             }
            if(I_STATUS[s] != 0x08)
            {
             checkint1();
            _nop_();

            }
            else
               cc=0;
         }

}


int select(SOCKET s, u_char func) reentrant
{
	int val;
	un_l2cval rd_ptr, wr_ptr, ack_ptr;
	u_char k;
	k = k;

	switch (func) {
	case SEL_CONTROL :                                     // socket status information
		val = SOCK_STATUS(s);
		break;

	case SEL_SEND :                                        // Calculate send free buffer size
		Int7_Ds();
		k = *SHADOW_TXWR_PTR(s);
                delay(10) ;

		wr_ptr.cVal[0] = *(TX_WR_PTR(s) + 0);
		wr_ptr.cVal[1] = *(TX_WR_PTR(s) + 1);
		wr_ptr.cVal[2] = *(TX_WR_PTR(s) + 2);
		wr_ptr.cVal[3] = *(TX_WR_PTR(s) + 3);
		if( (OPT_PROTOCOL(s)& 0x07) != SOCK_STREAM)
		{
			k = *SHADOW_TXRD_PTR(s);
			delay(10) ;
			ack_ptr.cVal[0] = *(TX_RD_PTR(s) + 0);
			ack_ptr.cVal[1] = *(TX_RD_PTR(s) + 1);
			ack_ptr.cVal[2] = *(TX_RD_PTR(s) + 2);
			ack_ptr.cVal[3] = *(TX_RD_PTR(s) + 3);

		}
		else
		{
			k = *SHADOW_TXACK_PTR(s);
			delay(10) ;
			ack_ptr.cVal[0] = *(TX_ACK_PTR(s) + 0);
			ack_ptr.cVal[1] = *(TX_ACK_PTR(s) + 1);
			ack_ptr.cVal[2] = *(TX_ACK_PTR(s) + 2);
			ack_ptr.cVal[3] = *(TX_ACK_PTR(s) + 3);
		}
//		Int7_En();

		if (wr_ptr.lVal >= ack_ptr.lVal) val = SSIZE[s] - (wr_ptr.lVal - ack_ptr.lVal);
		else val = SSIZE[s] - (0 - ack_ptr.lVal + wr_ptr.lVal);
		break;
	case SEL_RECV :                                        // Calculate received data size
		Int7_Ds();
		k = *SHADOW_RXWR_PTR(s);
                delay(20);

		wr_ptr.cVal[0] = *(RX_WR_PTR(s) + 0);
		wr_ptr.cVal[1] = *(RX_WR_PTR(s) + 1);
		wr_ptr.cVal[2] = *(RX_WR_PTR(s) + 2);
		wr_ptr.cVal[3] = *(RX_WR_PTR(s) + 3);
		k = *SHADOW_RXRD_PTR(s);
		 delay(20);

		rd_ptr.cVal[0] = *(RX_RD_PTR(s) + 0);
		rd_ptr.cVal[1] = *(RX_RD_PTR(s) + 1);
		rd_ptr.cVal[2] = *(RX_RD_PTR(s) + 2);
		rd_ptr.cVal[3] = *(RX_RD_PTR(s) + 3);
//		Int7_En();

		if (wr_ptr.lVal == rd_ptr.lVal)
		  { val = 0;
		    }
		else if (wr_ptr.lVal > rd_ptr.lVal)
		  {
		    val = wr_ptr.lVal - rd_ptr.lVal;

		   }
		else
		  val = 0 - rd_ptr.lVal + wr_ptr.lVal;


		break;
	default :
		val = -1;
		break;
	}

    return	( val );
}


u_int read_data(SOCKET s, u_char  * src, u_char  * dst, u_int len) reentrant
{
	u_int i, size, size1;
  //      dst=0xc020;
	if (len == 0) return 0;
        s=0;
	if( (((u_int)src & RMASK[0]) + len)  > RSIZE[0] )
	{
		size = RSIZE[0] - ((u_int)src & RMASK[0]);
		for (i = 0; i < size; i++) *dst++ = *src++;
		size1 = len - size;
		src =  RBUFBASEADDRESS[0];
		for (i = 0; i < size1; i++) *dst++ = *src++;
	}
	else
        	for (i = 0; i < (len&0x5ff); i++) //*dst++ = *src++;
                         *dst++ = *src++;
                     //  dst_buf[i]= *src++;
	return len;
}


u_int write_data(SOCKET s, u_char * src, u_char * dst, u_int len) reentrant
{
	u_int i, size, size1;

	if (len == 0) return 0;

	if ( (((u_int)dst & SMASK[s]) + len) > SSIZE[s] )
	{
		size = SSIZE[s] - ((UINT)dst & SMASK[s]);

		for (i = 0; i < size; i++) *dst++ = *src++;
		size1 = len - size;
		dst = (SBUFBASEADDRESS[s]);
		for (i = 0; i < size1; i++) *dst++ = *src++;
	}
	else
		for (i = 0; i < len; i++)
                      {
                      *dst++ = *src++;  //dst_buf[i] //temp_buf[i]; //*src++;
                   //   temp40[2]=0x33;
                   //   temp60[2]=0x44;
                      }

	return len;
}





void InitNetConfig(void)
{
        //unsigned char U8_buf[2];
	setMACAddr(RamMac_address);					//MAC setting
	setIP(RamSource_IP);						// source IP setting
	setgateway(RamGateway_IP);						// gateway address setting
	setsubmask(NetparameterRamSubnet_Mask_Value);
        setdesAddr(Destination_IP);

        INTMASK=0x11;
        settimeout(timeout1);				                                        // subnet mask setting
	sysinit(SBUFSIZE,RBUFSIZE);

}

              */
/////////***********************************************
void powerint(void) interrupt 0    //power down  protect
{_nop_();
 PCON=0x02;       //power down
 _nop_();
 while(1)
 {_nop_();
 }
}

//////
void snd1char(uchar dats)
{uint data cout;
 //SM2=0;
 tiflag=0;
 en489=1;
 SBUF=dats;

 //while(TI==0);
 //TI=0;


for(cout=0;cout<15000;cout++)
    {if(TI==1)
        {tiflag=1;
         TI=0;
         break;
        }
    }
  _nop_();
}
void get1char(void)
{uint data cout;
 riflag=0;
for(cout=0;cout<10000;cout++)
    {if(RI==1)
        {riflag=1;

⌨️ 快捷键说明

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