?? tcp.c
字號:
conxn[0].state = STATE_CLOSED;
comm_state = COMM_STATE_RCV;
rcv_wait_timer = RCV_WAIT_TIME;
}
else if(temp16 & FLG_ACK) //確認報處理
{
if((tcp->ack_number[0] == conxn[0].my_sequence[0])&&
(tcp->ack_number[1] == conxn[0].my_sequence[1])&&
(tcp->ack_number[2] == conxn[0].my_sequence[2])&&
(tcp->ack_number[3] == conxn[0].my_sequence[3]))
conxn[0].state = STATE_ESTABLISHED;
comm_state = COMM_STATE_RCV;
rcv_wait_timer = RCV_WAIT_TIME;
}
break;
case STATE_SYN_SENT: //同步報處理
conxn[0].his_ack[0] = tcp->ack_number[0];
conxn[0].his_ack[1] = tcp->ack_number[1];
conxn[0].his_ack[2] = tcp->ack_number[2];
conxn[0].his_ack[3] = tcp->ack_number[3];
if((temp16 & FLG_SYN)&&(temp16 & FLG_ACK))//同步確認報
{
if((tcp->ack_number[0] == conxn[0].my_sequence[0])&&
(tcp->ack_number[1] == conxn[0].my_sequence[1])&&
(tcp->ack_number[2] == conxn[0].my_sequence[2])&&
(tcp->ack_number[3] == conxn[0].my_sequence[3]))
{
temp32 = (tcp->sequence[0]<<24)+(tcp->sequence[1]<<16)+(tcp->sequence[2]<<8)+(tcp->sequence[3]);
temp32++;
conxn[0].his_sequence[0] = temp32>>24;
conxn[0].his_sequence[1] = (temp32 & 0x00ffffff)>>16;
conxn[0].his_sequence[2] = (temp32 & 0x0000ffff)>>8;
conxn[0].his_sequence[3] = (temp32 & 0x000000ff);
tcp_send(FLG_ACK,28,0);
conxn[0].state = STATE_ESTABLISHED;
comm_state = COMM_STATE_RCV;
rcv_wait_timer = RCV_WAIT_TIME;
}
}
else if(temp16 & FLG_SYN) //同步報
{
conxn[0].ipaddr[0] = ip->source_ipaddr[0];
conxn[0].ipaddr[1] = ip->source_ipaddr[1];
conxn[0].ipaddr[2] = ip->source_ipaddr[2];
conxn[0].ipaddr[3] = ip->source_ipaddr[3];
conxn[0].port[0] = tcp->source_port[0];
conxn[0].port[1] = tcp->source_port[1];
temp32 = (tcp->sequence[0]<<24)+(tcp->sequence[1]<<16)+(tcp->sequence[2]<<8)+(tcp->sequence[3]);
temp32++;
conxn[0].his_sequence[0] = temp32>>24;
conxn[0].his_sequence[1] = (temp32 & 0x00ffffff)>>16;
conxn[0].his_sequence[2] = (temp32 & 0x0000ffff)>>8;
conxn[0].his_sequence[3] = (temp32 & 0x000000ff);
conxn[0].his_ack[0] = tcp->ack_number[0];
conxn[0].his_ack[1] = tcp->ack_number[1];
conxn[0].his_ack[2] = tcp->ack_number[2];
conxn[0].his_ack[3] = tcp->ack_number[3];
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];
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);
tcp_send(FLG_SYN | FLG_ACK, 28, 0);
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);
conxn[0].state = STATE_SYN_RCVD;
comm_state = COMM_STATE_RCV;
rcv_wait_timer = RCV_WAIT_TIME;
}
else if(temp16 & FLG_ACK) //確認報
{
conxn[0].my_sequence[0] =conxn[0].his_ack[0];
conxn[0].my_sequence[1] =conxn[0].his_ack[1];
conxn[0].my_sequence[2] =conxn[0].his_ack[2];
conxn[0].my_sequence[3] =conxn[0].his_ack[3];
tcp_send(FLG_RST, 20, 0);
time_s = 1;
conxn[0].state = STATE_CLOSED;
comm_state = COMM_STATE_RCV;
rcv_wait_timer = RCV_WAIT_TIME;
}
break;
case STATE_ESTABLISHED:
conxn[0].his_ack[0] = tcp->ack_number[0]; //保存發(fā)送端的確認號
conxn[0].his_ack[1] = tcp->ack_number[1];
conxn[0].his_ack[2] = tcp->ack_number[2];
conxn[0].his_ack[3] = tcp->ack_number[3];
if (temp16 & FLG_FIN)
{ temp32 = (conxn[0].his_sequence[0]<<24)+(conxn[0].his_sequence[1]<<16)+(conxn[0].his_sequence[2]<<8)+(conxn[0].his_sequence[3]);
temp32 ++;
conxn[0].his_sequence[0] = temp32>>24;
conxn[0].his_sequence[1] = (temp32 & 0x00ffffff)>>16;
conxn[0].his_sequence[2] = (temp32 & 0x0000ffff)>>8;
conxn[0].his_sequence[3] = (temp32 & 0x000000ff);
tcp_send(FLG_ACK, 20, 0);
conxn[0].state = STATE_CLOSE_WAIT;
tcp_send(FLG_FIN | FLG_ACK, 20, 0);
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);
conxn[0].state = STATE_LAST_ACK;
comm_state = COMM_STATE_RCV;
rcv_wait_timer = RCV_WAIT_TIME;
}
else if (data_len != 0)
{ temp32 = (conxn[0].his_sequence[0]<<24)+(conxn[0].his_sequence[1]<<16)+(conxn[0].his_sequence[2]<<8)+(conxn[0].his_sequence[3]);
temp32 += data_len;
conxn[0].his_sequence[0] = temp32>>24;
conxn[0].his_sequence[1] = (temp32 & 0x00ffffff)>>16;
conxn[0].his_sequence[2] = (temp32 & 0x0000ffff)>>8;
conxn[0].his_sequence[3] = (temp32 & 0x000000ff); //服務器端發(fā)送的序列號+發(fā)送的數(shù)據(jù)長度
// if((conxn[0].my_sequence[0] == tcp->ack_number[0])&&
// (conxn[0].my_sequence[1] == tcp->ack_number[1])&&
// (conxn[0].my_sequence[2] == tcp->ack_number[2])&&
// (conxn[0].my_sequence[3] == tcp->ack_number[3]))
// {
tcp_send(FLG_ACK, 20, 0); // Send ACK
///////////////////添加代碼////////////////////////////////////
my_server(inbuf, header_len,data_len, 0);
// conxn[0].inactivity = INACTIVITY_TIME;
comm_state = COMM_STATE_SEND_WAIT;
send_wait_timer = SEND_WAIT_TIME;
}
else if ( temp16 & FLG_ACK) //表示數(shù)據(jù)發(fā)送成功
{
comm_state = COMM_STATE_RCV;
rcv_wait_timer = RCV_WAIT_TIME;
if(plussta == 1)
{
if((conxn[0].his_ack[0]!=conxn[0].my_sequence[0])||
(conxn[0].his_ack[1]!=conxn[0].my_sequence[1])||
(conxn[0].his_ack[2]!=conxn[0].my_sequence[2])||
(conxn[0].his_ack[3]!=conxn[0].my_sequence[3]))
{
tcp_link(FLG_SYN);
}
plussta = 0;
}
tcp_rec.tcp_ack = 1;
tcp_send_dly = 0; //發(fā)送數(shù)據(jù)—服務器端確認延遲復位
}
break;
case STATE_CLOSE_WAIT:
comm_state = COMM_STATE_RCV;
break;
case STATE_LAST_ACK:
conxn[0].his_ack[0] = tcp->ack_number[0];
conxn[0].his_ack[1] = tcp->ack_number[1];
conxn[0].his_ack[2] = tcp->ack_number[2];
conxn[0].his_ack[3] = tcp->ack_number[3];
if ((temp16 & FLG_ACK )&&
(tcp->ack_number[0] == conxn[0].my_sequence[0])&&
(tcp->ack_number[1] == conxn[0].my_sequence[1])&&
(tcp->ack_number[2] == conxn[0].my_sequence[2])&&
(tcp->ack_number[3] == conxn[0].my_sequence[3]))
{
conxn[0].state = STATE_CLOSED;
conxn[0].ipaddr[0] = 0; // Free up struct area
conxn[0].ipaddr[1] = 0;
conxn[0].ipaddr[2] = 0;
conxn[0].ipaddr[3] = 0;
just_closed = TRUE;
}
comm_state = COMM_STATE_RCV;
rcv_wait_timer = RCV_WAIT_TIME;
break;
case STATE_FIN_WAIT_1:
temp32 = (conxn[0].his_sequence[0]<<24)+(conxn[0].his_sequence[1]<<16)+(conxn[0].his_sequence[2]<<8)+(conxn[0].his_sequence[3]);
temp32 += data_len;
conxn[0].his_sequence[0] = temp32>>24;
conxn[0].his_sequence[1] = (temp32 & 0x00ffffff)>>16;
conxn[0].his_sequence[2] = (temp32 & 0x0000ffff)>>8;
conxn[0].his_sequence[3] = (temp32 & 0x000000ff);
conxn[0].his_ack[0] = tcp->ack_number[0];
conxn[0].his_ack[1] = tcp->ack_number[1];
conxn[0].his_ack[2] = tcp->ack_number[2];
conxn[0].his_ack[3] = tcp->ack_number[3];
if (temp16 & FLG_FIN)
{ temp32 = (conxn[0].his_sequence[0]<<24)+(conxn[0].his_sequence[1]<<16)+(conxn[0].his_sequence[2]<<8)+(conxn[0].his_sequence[3]);
temp32 ++;
conxn[0].his_sequence[0] = temp32>>24;
conxn[0].his_sequence[1] = (temp32 & 0x00ffffff)>>16;
conxn[0].his_sequence[2] = (temp32 & 0x0000ffff)>>8;
conxn[0].his_sequence[3] = (temp32 & 0x000000ff);
tcp_send(FLG_ACK, 20, 0);
comm_state = COMM_STATE_RCV;
rcv_wait_timer = RCV_WAIT_TIME;
if ((tcp->ack_number[0] == conxn[0].my_sequence[0])&&
(tcp->ack_number[1] == conxn[0].my_sequence[1])&&
(tcp->ack_number[2] == conxn[0].my_sequence[2])&&
(tcp->ack_number[3] == conxn[0].my_sequence[3]))
{
// conxn[0].state = STATE_TIME_WAIT;
conxn[0].state = STATE_CLOSED;
conxn[0].ipaddr[0] = 0; // Free up connection
conxn[0].ipaddr[1] = 0;
conxn[0].ipaddr[2] = 0;
conxn[0].ipaddr[3] = 0;
just_closed = TRUE;
}
else
{
conxn[0].state = STATE_CLOSING;
}
}
else if ((tcp->ack_number[0] == conxn[0].my_sequence[0])&&
(tcp->ack_number[1] == conxn[0].my_sequence[1])&&
(tcp->ack_number[2] == conxn[0].my_sequence[2])&&
(tcp->ack_number[3] == conxn[0].my_sequence[3]))
{
conxn[0].state = STATE_FIN_WAIT_2;
}
break;
case STATE_FIN_WAIT_2:
temp32 = (conxn[0].his_sequence[0]<<24)+(conxn[0].his_sequence[1]<<16)+(conxn[0].his_sequence[2]<<8)+(conxn[0].his_sequence[3]);
temp32 += data_len;
conxn[0].his_sequence[0] = temp32>>24;
conxn[0].his_sequence[1] = (temp32 & 0x00ffffff)>>16;
conxn[0].his_sequence[2] = (temp32 & 0x0000ffff)>>8;
conxn[0].his_sequence[3] = (temp32 & 0x000000ff);
conxn[0].his_ack[0] = tcp->ack_number[0];
conxn[0].his_ack[1] = tcp->ack_number[1];
conxn[0].his_ack[2] = tcp->ack_number[2];
conxn[0].his_ack[3] = tcp->ack_number[3];
if (temp16 & FLG_FIN)
{ temp32 = (conxn[0].his_sequence[0]<<24)+(conxn[0].his_sequence[1]<<16)+(conxn[0].his_sequence[2]<<8)+(conxn[0].his_sequence[3]);
temp32 ++; // For his FIN flag
conxn[0].his_sequence[0] = temp32>>24;
conxn[0].his_sequence[1] = (temp32 & 0x00ffffff)>>16;
conxn[0].his_sequence[2] = (temp32 & 0x0000ffff)>>8;
conxn[0].his_sequence[3] = (temp32 & 0x000000ff);
tcp_send(FLG_ACK, 20, 0);
// conxn[0].state = STATE_TIME_WAIT;
conxn[0].state = STATE_CLOSED;
conxn[0].ipaddr[0] = 0; // Free up struct area
conxn[0].ipaddr[1] = 0;
conxn[0].ipaddr[2] = 0;
conxn[0].ipaddr[3] = 0;
just_closed = TRUE;
comm_state = COMM_STATE_RCV;
rcv_wait_timer = RCV_WAIT_TIME;
}
break;
case STATE_TIME_WAIT:
comm_state = COMM_STATE_RCV;
rcv_wait_timer = RCV_WAIT_TIME;
break;
case STATE_CLOSING:
conxn[0].his_ack[0] = tcp->ack_number[0];
conxn[0].his_ack[1] = tcp->ack_number[1];
conxn[0].his_ack[2] = tcp->ack_number[2];
conxn[0].his_ack[3] = tcp->ack_number[3];
if ((tcp->ack_number[0] == conxn[0].my_sequence[0])&&
(tcp->ack_number[1] == conxn[0].my_sequence[1])&&
(tcp->ack_number[2] == conxn[0].my_sequence[2])&&
(tcp->ack_number[3] == conxn[0].my_sequence[3]))
{
// conxn[0].state = STATE_TIME_WAIT;
conxn[0].state = STATE_CLOSED;
conxn[0].ipaddr[0] = 0; // Free up struct area
conxn[0].ipaddr[1] = 0;
conxn[0].ipaddr[2] = 0;
conxn[0].ipaddr[3] = 0;
just_closed = TRUE;
}
comm_state = COMM_STATE_RCV;
break;
default: break;
}
// This is for debug, to see when conxn closes
if (just_closed)
{
just_closed = FALSE;
}
}
void tcp_send(uint16 flags, uint16 hdr_len, uint8 nr)
{
uint32 sum;
uint16 result,temp16;
uint8 * outbuf;
TCP_HEADER * tcp;
IP_HEADER * ip;
uint8 dest[4];
outbuf = Net_send_buf;
tcp = (TCP_HEADER *)(outbuf + 34);
ip = (IP_HEADER *)(outbuf + 14);
if (nr == NO_CONNECTION)
{
tcp->source_port[0] = MY_PORT>>8;
tcp->source_port[1] = (uint8)MY_PORT;
tcp->dest_port[0] = sender_tcpport[0];
tcp->dest_port[1] = sender_tcpport[1];
tcp->sequence[0] = 0;
tcp->sequence[1] = 0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -