??? 06/18/07 08:34 Read: times |
#140931 - Ya. Responding to: ???'s previous message |
Here is snap shoot of the code:
I have made it a little messy so... //****************************************************************** //* TCP Function //* This function uses TCP protocol to act as a Telnet/Web server on //* port 23/80 decimal. The application function is called with //* //****************************************************************** void tcp() { //assemble the destination port address from the incoming packet portaddr = make16(packet[TCP_destport],packet[TCP_destport+1]); //calculate the length of the data coming in with the packet //tcpdatalen_in = incoming packet length - incoming ip header length - //incoming tcp header length tcpdatalen_in = (make16(packet[ip_pktlen],packet[ip_pktlen+1]))- ((packet[ip_vers_len] & 0x0F)* 4)-(((packet[TCP_hdrflags] & 0xF0) >> 4) * 4); if(tcpdatalen_in>600)tcpdatalen_in=600; //If an ACK is received and the destination port address is valid //and no data is in the packet if(ACK_IN && tcpdatalen_in == 0x00) { //assemble the acknowledgment number from the incoming packet incoming_ack =make32(packet[TCP_acknum],packet[TCP_acknum+1], \ packet[TCP_acknum+2],packet[TCP_acknum+3]); //if the incoming packet is a result of session establishment if(synflag_bit) { //clear the SYN flag clr_synflag; Connected=1; //the incoming acknowledgment is my new sequence number my_seqnum = incoming_ack; //if Telnet,send the Telnet server banner //strcpy(&packet[TCP_data],"ASBC alpha\r\n\r\n"); // tcpdatalen_out = 14; //expect to get an acknowledgment of the banner message expected_ack = my_seqnum +tcpdatalen_out; //send the TCP/IP packet send_tcp_packet(); } } //if an ack is received and the port address is valid and there is data //in the incoming packet if((ACK_IN) && tcpdatalen_in) { for(i=0;i<tcpdatalen_in;++i) //receive the data and put it into the incoming data buffer dat_buff[i] = packet[TCP_data+i]; application_code(); tcpdatalen_out=strlen(&packet[TCP_data]); //assemble the acknowledgment number from the incoming packet incoming_ack =make32(packet[TCP_acknum],packet[TCP_acknum+1], \ packet[TCP_acknum+2],packet[TCP_acknum+3]); //check for the number of bytes acknowledged //determine how many bytes are outstanding and adjust the outgoing //sequence number accordingly if(incoming_ack <= expected_ack) my_seqnum = expected_ack - (expected_ack - incoming_ack); //my expected acknowledgement number expected_ack = my_seqnum +tcpdatalen_out; send_tcp_packet(); } //this code segment processes the incoming SYN from the client //and sends back the initial sequence number (ISN) and acknowledges //the incoming SYN packet if(SYN_IN ) { tcpdatalen_in = 0x01; set_synflag; setipaddrs(); data_L = packet[TCP_srcport]; packet[TCP_srcport] = packet[TCP_destport]; packet[TCP_destport] = data_L; data_L = packet[TCP_srcport+1]; packet[TCP_srcport+1] = packet[TCP_destport+1]; packet[TCP_destport+1] = data_L; assemble_ack(); if(++ISN == 0x0000 || ++ISN == 0xFFFF) my_seqnum = 0x1234FFFF; set_packet32(TCP_seqnum,my_seqnum); packet[TCP_hdrflags+1] = 0x00; SYN_OUT; ACK_OUT; packet[TCP_cksum] = 0x00; packet[TCP_cksum+1] = 0x00; hdr_chksum =0; tcplen = make16(packet[ip_pktlen],packet[ip_pktlen+1]) - ((packet[ip_vers_len] & 0x0F) * 4); hdrlen = tcplen; addr = &packet[TCP_srcport]; cksum(); hdrlen = 0x08; addr = &packet[ip_srcaddr]; cksum(); hdr_chksum = hdr_chksum + make16(0,packet[ip_proto])+ tcplen; chksum16= ~(hdr_chksum + ((hdr_chksum & 0xFFFF0000) >> 16)); packet[TCP_cksum] = make8(chksum16,1); packet[TCP_cksum+1] = make8(chksum16,0); echo_packet(); } //this code segment processes a FIN from the client //and acknowledges the FIN and any incoming data. if(FIN_IN && Connected) { for(i=0;i<tcpdatalen_in;++i) dat_buff[i] = packet[TCP_data+i]; application_code(); tcpdatalen_out=strlen(&packet[TCP_data]); set_finflag; Connected=0; ++tcpdatalen_in; incoming_ack =make32(packet[TCP_acknum],packet[TCP_acknum+1], \ packet[TCP_acknum+2],packet[TCP_acknum+3]); if(incoming_ack <= expected_ack) my_seqnum = expected_ack - (expected_ack - incoming_ack); expected_ack = my_seqnum +tcpdatalen_out; send_tcp_packet(); } } |
Topic | Author | Date |
Ethernet question. | 01/01/70 00:00 | |
More info required | 01/01/70 00:00 | |
Details | 01/01/70 00:00 | |
Packet monitor | 01/01/70 00:00 | |
thanks. | 01/01/70 00:00 | |
Sequence Numbers...? | 01/01/70 00:00 | |
Ya. | 01/01/70 00:00 | |
Show the log when corruption occured | 01/01/70 00:00 | |
I fix it..kinda.![]() | 01/01/70 00:00 | |
Not so unusual for 8-bit micros server | 01/01/70 00:00 |