?? tcp.c
字號:
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; //定義目標端口(服務(wù)器端口)
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]; //定義服務(wù)器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; //發(fā)送數(shù)據(jù)—服務(wù)器端確認延遲
}
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]開始為收到的數(shù)據(jù)
//數(shù)據(jù)處理......
//============================
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]開始為收到的數(shù)據(jù)
//數(shù)據(jù)處理......
//============================
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 ;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -