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

📄 tcp.c

📁 最简单的TCP协议栈
💻 C
📖 第 1 页 / 共 3 页
字号:
      tcp->sequence[2] = 0;
      tcp->sequence[3] = 0;
      
      tcp->ack_number[0] = 0;
      tcp->ack_number[1] = 0;
      tcp->ack_number[2] = 0;
      tcp->ack_number[3] = 0;
      
      dest[0] = sender_ipaddr[0];
      dest[1] = sender_ipaddr[1];
      dest[2] = sender_ipaddr[2];
      dest[3] = sender_ipaddr[3];
      
   }
   else if (nr < 5)
   {
      // This message is to connected port
      tcp->source_port[0] = MY_PORT>>8;
      tcp->source_port[1] = (uint8)MY_PORT;
      
      tcp->dest_port[0] = conxn[nr].port[0];
      tcp->dest_port[1] = conxn[nr].port[1];

      tcp->sequence[0]  = conxn[nr].my_sequence[0];
      tcp->sequence[1]  = conxn[nr].my_sequence[1];
      tcp->sequence[2]  = conxn[nr].my_sequence[2];
      tcp->sequence[3]  = conxn[nr].my_sequence[3];
	  
   	  tcp->ack_number[0] = conxn[nr].his_sequence[0];
   	  tcp->ack_number[1] = conxn[nr].his_sequence[1];
   	  tcp->ack_number[2] = conxn[nr].his_sequence[2];
   	  tcp->ack_number[3] = conxn[nr].his_sequence[3];
      	 
      dest[0] = conxn[nr].ipaddr[0];
      dest[1] = conxn[nr].ipaddr[1];
      dest[2] = conxn[nr].ipaddr[2];
      dest[3] = conxn[nr].ipaddr[3];
   }
   else
		return;
		
   temp16 = (hdr_len << 10) | flags;
   
   tcp->flags[0] = temp16>>8;
   tcp->flags[1] = temp16;
   
   tcp->window[0] = MYWINDOWS>>8;
   tcp->window[1] = (uint8)MYWINDOWS;
   
   tcp->checksum[0] = 0;
   tcp->checksum[1] = 0;
   
   tcp->urgent_ptr[0] = 0;
   tcp->urgent_ptr[0] = 0;
   
   if (hdr_len == 28)
   {
      memcpy(&tcp->options, opt, 8);
   }   
   
	ip->dest_ipaddr[0] = dest[0];
	ip->dest_ipaddr[1] = dest[1];
	ip->dest_ipaddr[2] = dest[2];
	ip->dest_ipaddr[3] = dest[3];
	
	ip->source_ipaddr[0] = my_ipaddr[0];
	ip->source_ipaddr[1] = my_ipaddr[1];
	ip->source_ipaddr[2] = my_ipaddr[2];
	ip->source_ipaddr[3] = my_ipaddr[3];
		
	sum = (uint32)cksum(outbuf + 26, 8 + hdr_len);
				
	sum += (uint32)0x0006;
	sum += (uint32)hdr_len;

	// In case there was a carry, add it back around
	result = (uint16)(sum + (sum >> 16));
	
	tcp->checksum[0] = (~result)>>8;
    tcp->checksum[1] = (~result);
    
	ip_send(outbuf, dest, TCP_TYPE, hdr_len);

   // (Re)start TCP retransmit timer
   conxn[nr].timer = TCP_TIMEOUT;
}

void tcp_link(uint16 flags)
{
	uint32 sum, temp32;
  	uint16 result,temp16;
    uint8 * outbuf;
    uint8 dest[4];
   TCP_HEADER  * tcp;
   IP_HEADER  * ip;
   outbuf = Net_send_buf;
  	   
   tcp = (TCP_HEADER *)(outbuf + 34);
   ip = (IP_HEADER *)(outbuf + 14);


//////////////////////////////////////////////////////////////
  conxn[0].ipaddr[0] = server_ipaddr[0];//ip->source_ipaddr;
  conxn[0].ipaddr[1] = server_ipaddr[1];
  conxn[0].ipaddr[2] = server_ipaddr[2];
  conxn[0].ipaddr[3] = server_ipaddr[3];
  
  conxn[0].port[0] = server_port>>8;
  conxn[0].port[1] = (uint8)server_port;
  
//  conxn[0].state = STATE_LISTEN;
  conxn[0].his_sequence[0] = 0;
  conxn[0].his_sequence[1] = 0;
  conxn[0].his_sequence[2] = 0;
  conxn[0].his_sequence[3] = 0;
  
  conxn[0].his_ack[0] = 0;
  conxn[0].his_ack[1] = 0;
  conxn[0].his_ack[2] = 0;
  conxn[0].his_ack[3] = 0;

  conxn[0].my_sequence[0] = initial_sequence_nr[0];
  conxn[0].my_sequence[1] = initial_sequence_nr[1];
  conxn[0].my_sequence[2] = initial_sequence_nr[2];
  conxn[0].my_sequence[3] = initial_sequence_nr[3];
  
  tcp->sequence[0] = conxn[0].my_sequence[0];
  tcp->sequence[1] = conxn[0].my_sequence[1];
  tcp->sequence[2] = conxn[0].my_sequence[2];
  tcp->sequence[3] = conxn[0].my_sequence[3];
  
  temp32 = (initial_sequence_nr[0]<<24)+(initial_sequence_nr[1]<<16)+(initial_sequence_nr[2]<<8)+(initial_sequence_nr[3]);
  temp32 += 64000;
  initial_sequence_nr[0] = temp32>>24;
  initial_sequence_nr[1] = (temp32 & 0x00ffffff)>>16;
  initial_sequence_nr[2] = (temp32 & 0x0000ffff)>>8;
  initial_sequence_nr[3] = (temp32 & 0x000000ff);

  temp32 = (conxn[0].my_sequence[0]<<24)+(conxn[0].my_sequence[1]<<16)+(conxn[0].my_sequence[2]<<8)+(conxn[0].my_sequence[3]);
  temp32 ++;
  conxn[0].my_sequence[0] = temp32>>24;
  conxn[0].my_sequence[1] = (temp32 & 0x00ffffff)>>16;
  conxn[0].my_sequence[2] = (temp32 & 0x0000ffff)>>8;
  conxn[0].my_sequence[3] = (temp32 & 0x000000ff);
///////////////////////////////////////////////////////////////             

   tcp->source_port[0] = MY_PORT>>8;			//定义源端口
   tcp->source_port[1] = (uint8)MY_PORT;
   
   tcp->dest_port[0] = server_port>>8;   //定义目标端口(服务器端口)
   tcp->dest_port[1] = (uint8)server_port;
  // tcp->sequence = initial_sequence_nr;							//定义序列号
   tcp->ack_number[0] = 0;						//定义确认号
   tcp->ack_number[1] = 0;
   tcp->ack_number[2] = 0;
   tcp->ack_number[3] = 0;
   
   dest[0] = server_ipaddr[0];						//定义服务器IP地址
   dest[1] = server_ipaddr[1];
   dest[2] = server_ipaddr[2];
   dest[3] = server_ipaddr[3];
   
   temp16 = (28 << 10) | flags;
   tcp->flags[0] = temp16>>8;
   tcp->flags[1] = (uint8)temp16;
   
   tcp->window[0] = MYWINDOWS>>8;
   tcp->window[1] = (uint8)MYWINDOWS;
   
   tcp->checksum[0] = 0;
   tcp->checksum[1] = 0;
   
   tcp->urgent_ptr[0] = 0;
   tcp->urgent_ptr[1] = 0;
 	 memcpy(&tcp->options, opt, 8);
	ip->dest_ipaddr[0] = server_ipaddr[0];
	ip->dest_ipaddr[1] = server_ipaddr[1];
	ip->dest_ipaddr[2] = server_ipaddr[2];
	ip->dest_ipaddr[3] = server_ipaddr[3];
	
	ip->source_ipaddr[0] = my_ipaddr[0];
	ip->source_ipaddr[1] = my_ipaddr[1];
	ip->source_ipaddr[2] = my_ipaddr[2];
	ip->source_ipaddr[3] = my_ipaddr[3];
		
	// Sum source_ipaddr, dest_ipaddr, and entire TCP message 
	sum = (uint32)cksum(outbuf + 26, 36);
				
	// Add in the rest of pseudoheader which is
	// protocol id and TCP segment length
	sum += (uint32)0x0006;
	sum += (uint32)28;

	// In case there was a carry, add it back around
	result = (uint16)(sum + (sum >> 16));
	tcp->checksum[0] = (~result)>>8;
	tcp->checksum[1] = (~result);

	ip_send(outbuf, dest, TCP_TYPE, 28);
    conxn[0].state = STATE_SYN_SENT;
//  conxn[nr].timer = TCP_TIMEOUT;
}


void myserver_send(uint8 * outbuf, uint16 len)
{
   TCP_HEADER * tcp;
   IP_HEADER * ip;
   uint32 sum;
   uint16 result,temp16;
          
   tcp = (TCP_HEADER  *)(outbuf + 34);
   ip = (IP_HEADER  *)(outbuf + 14);

   tcp->source_port[0] = MY_PORT>>8;
   tcp->source_port[1] = (uint8)MY_PORT;
   
   tcp->dest_port[0] = conxn[0].port[0];
   tcp->dest_port[1] = conxn[0].port[1];
   
   tcp->sequence[0] = conxn[0].my_sequence[0];
   tcp->sequence[1] = conxn[0].my_sequence[1];
   tcp->sequence[2] = conxn[0].my_sequence[2];
   tcp->sequence[3] = conxn[0].my_sequence[3];
   
   tcp->ack_number[0] = conxn[0].his_sequence[0];
   tcp->ack_number[1] = conxn[0].his_sequence[1];
   tcp->ack_number[2] = conxn[0].his_sequence[2];
   tcp->ack_number[3] = conxn[0].his_sequence[3];
      
   temp16 = 0x5000 | FLG_ACK | FLG_PSH;
   tcp->flags[0] = temp16>>8;
   tcp->flags[1] = (uint8)temp16;
   
   tcp->window[0] = MYWINDOWS>>8;
   tcp->window[1] = (uint8)MYWINDOWS;
   
   tcp->checksum[0] = 0;
   tcp->checksum[1] = 0;
   
   tcp->urgent_ptr[0] = 0;
   tcp->urgent_ptr[1] = 0;
   
   ip->dest_ipaddr[0] = conxn[0].ipaddr[0];
   ip->dest_ipaddr[1] = conxn[0].ipaddr[1];
   ip->dest_ipaddr[2] = conxn[0].ipaddr[2];
   ip->dest_ipaddr[3] = conxn[0].ipaddr[3];
   
   ip->source_ipaddr[0] = my_ipaddr[0];
   ip->source_ipaddr[1] = my_ipaddr[1];
   ip->source_ipaddr[2] = my_ipaddr[2];
   ip->source_ipaddr[3] = my_ipaddr[3];
   
	// Sum source_ipaddr, dest_ipaddr, and entire TCP message 
	sum = (uint32)cksum(outbuf + 26, 8 + len);
	sum += (uint32)0x0006;
	sum += (uint32)len;

	result = (uint16)(sum + (sum >> 16));
	temp16 = (~result);
	tcp->checksum[0] = (temp16 )>> 8;
	tcp->checksum[1] = (temp16 );
/////////////////////////////////////////////////////////////////    
///	sum = (uint32)cksum(outbuf + 26, 8 + len);
//	sum += (uint32)0x0006;     
//	sum += (uint32)len;
//	result = (uint32)(sum + (sum >> 16)); 
//	while(result--);
/////////////////////////////////////////////////////////

	ip_send(outbuf, conxn[0].ipaddr, TCP_TYPE, len);

   // (Re)start TCP retransmit timer
   conxn[0].timer = TCP_TIMEOUT;
   tcp_send_dly = 10;								  //发送数据—服务器端确认延迟

}


void my_server(uint8 * inbuf, uint16 header_len,uint16 data_len1,uint8 resend)
{
//	UINT idata body_len;
	uint8 * outbuf;
	uint8 * tcp_data;
	uint8 request;
//    uint32 temp32;
	
	if (!resend)
	   {
		tcp_data = inbuf + 34 + header_len;
		memcpy(conxn[0].query, tcp_data, 20);
		conxn[0].old_sequence[0] = conxn[0].my_sequence[0];
		conxn[0].old_sequence[1] = conxn[0].my_sequence[1];
		conxn[0].old_sequence[2] = conxn[0].my_sequence[2];
		conxn[0].old_sequence[3] = conxn[0].my_sequence[3];
	   }
	
    else{
		tcp_data = inbuf;
		conxn[0].my_sequence[0] = conxn[0].old_sequence[0];
		conxn[0].my_sequence[1] = conxn[0].old_sequence[1];
		conxn[0].my_sequence[2] = conxn[0].old_sequence[2];
		conxn[0].my_sequence[3] = conxn[0].old_sequence[3];
	}

	request = 0;

	outbuf = Net_rcvdata_buf;

	memcpy(outbuf,tcp_data,data_len1);
//	UART0_SendStr(outbuf,data_len1);
	Protoc_rcv(outbuf,data_len1);
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
/*	outbuf = Net_send_buf;
	memcpy(outbuf+54,tcp_data,data_len1);
//从inbuf[54]开始为收到的数据
//数据处理......
//============================		
	myserver_send(outbuf, data_len1 + 20);  // Segment length = body_len + 20
	
	temp32 = (conxn[0].my_sequence[0]<<24)+(conxn[0].my_sequence[1]<<16)+(conxn[0].my_sequence[2]<<8)+(conxn[0].my_sequence[3]);
	temp32 +=data_len1;
	conxn[0].my_sequence[0] = (temp32>>24);
	conxn[0].my_sequence[1] = (temp32 & 0x00ffffff)>>16;
	conxn[0].my_sequence[2] = (temp32 & 0x0000ffff)>>8;
	conxn[0].my_sequence[3] = (temp32 & 0x000000ff);	*/
}

void my_plusedata(void)
{
	uint8 * outbuf;
    uint32 temp32;
	
	outbuf = Net_send_buf;
//	memcpy(outbuf+54,tcp_data,20);
//从inbuf[54]开始为收到的数据
//数据处理......
//============================		
	myserver_send(outbuf, 21);  // Segment length = body_len + 20
	
	temp32 = (conxn[0].my_sequence[0]<<24)+(conxn[0].my_sequence[1]<<16)+(conxn[0].my_sequence[2]<<8)+(conxn[0].my_sequence[3]);
	temp32 ++;
	conxn[0].my_sequence[0] = (temp32>>24);
	conxn[0].my_sequence[1] = (temp32 & 0x00ffffff)>>16;
	conxn[0].my_sequence[2] = (temp32 & 0x0000ffff)>>8;
	conxn[0].my_sequence[3] = (temp32 & 0x000000ff);
  	plussta = 1 ; 

}

⌨️ 快捷键说明

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