import java.net.*; import java.util.*; import java.io.*; class packet //denotes a TCP packet { String mpack; public packet() { mpack = new String(""); } public packet(String s) { mpack =s; } String padding(int arg,int plen) { String x = toBool(arg); String ans = new String(""); for(int i=x.length();i0)?(pMaker.mywin - p.size()):0; //System.out.println("Hippy "+ p.size()); } else neu.set(p); synchronized(rBuffer) { rBuffer.remove(p.findseqno()); rBuffer.put(p.findseqno(),neu); } } public synchronized void writesBuff(packet p) { if(p!=null) { glpack neu = new glpack(); neu.set(p); synchronized(sBuffer) { sBuffer.put(p.findseqno(),neu); } } } public synchronized packet fetchrBuff(int x) { int[] seq =null; if(rBuffer.size()==0) return null; Iterator keys = null; synchronized(rBuffer) { keys= rBuffer.keySet().iterator(); seq = new int[rBuffer.size()]; } int i=0; while(keys.hasNext()) { ////System.out.println("Sequence" + i + "is" + xx + " seq size is " + seq.length); seq[i++] = ((Integer)keys.next()).intValue(); ////System.out.println("Reprinting" + seq[i-1]); } Arrays.sort(seq); i=seq[seq.length-1]; glpack ans = (glpack)rBuffer.get(i); if(ans.isunmark(x)) return null; for(int pp:seq) { int temp = pp; if(temp<=i) { glpack tempgl = (glpack)rBuffer.get(temp); tempgl.marks(x); synchronized(rBuffer) { rBuffer.remove(temp); rBuffer.put(temp,tempgl); } } } return ans.getpacket(); } public synchronized packet fetchrBuffmod(int x) { int[] seq =null; if(rBuffer.size()==0) return null; Iterator keys = null; synchronized(rBuffer) { keys= rBuffer.keySet().iterator(); seq = new int[rBuffer.size()]; } int i=0; while(keys.hasNext()) { seq[i++] = ((Integer)keys.next()); ////System.out.println("Sequence" + i + "is" + xx + " seq size is " + seq.length); ////System.out.println("Reprinting" + seq[i-1]); } Arrays.sort(seq); for(int pp:seq) { glpack tempgl = (glpack)rBuffer.get(pp); if(!(tempgl.isunmark(x))) { tempgl.marks(x); synchronized(rBuffer) { rBuffer.remove(pp); rBuffer.put(pp,tempgl); } return tempgl.getpacket(); } } return null; } public synchronized packet fetchrBuffseq(int x) { //System.out.print(""); //Donot remove this if(rBuffer.size()==0) return null; int[] seq =null; int i=0; Iterator keys = null; synchronized(rBuffer) { keys= rBuffer.keySet().iterator(); seq = new int[rBuffer.size()]; } while(keys.hasNext()) { seq[i++] = ((Integer)keys.next()); ////System.out.println("Sequence" + i + "is" + xx + " seq size is " + seq.length); ////System.out.println("Reprinting" + seq[i-1]); } glpack ans = null; Arrays.sort(seq); for(int y : seq) { if((y==pMaker.nextexp)||(pMaker.nextexp==0)) { ans = (glpack)rBuffer.get(y); ans.marks(x); synchronized(rBuffer) { rBuffer.remove(y); rBuffer.put(y,ans); } if(pMaker.nextexp==0) pMaker.nextexp = y; pMaker.nextexp++; } } //System.out.println("Next expecting "+ pMaker.nextexp); if(ans!=null) { return ans.getpacket(); } return null; } public synchronized int fetchunmarksBuff(packet p, int x) { if(p==null) return 0; int sizes = 0; int numbr = 0; int[] seq =null; int i=0; Iterator keys = null; synchronized(sBuffer) { keys= sBuffer.keySet().iterator(); seq = new int[sBuffer.size()]; } while(keys.hasNext()) { seq[i++] = ((Integer)keys.next()); ////System.out.println("Sequence" + i + "is" + xx + " seq size is " + seq.length); ////System.out.println("Reprinting" + seq[i-1]); } Arrays.sort(seq); for(int pp:seq) { int temp = pp; if(temp((long)10000)) { temp.unsent(); flag = true; /*synchronized(sBuffer) { sBuffer.remove(ii); sBuffer.put(ii,temp); }*/ } } } return flag; } public synchronized String server() { int i=0; int[] keyvals =null; Iterator keys = null; synchronized(sBuffer) { keyvals = new int[sBuffer.size()]; keys = sBuffer.keySet().iterator(); } while(keys.hasNext()) { keyvals[i++] = ((Integer)keys.next()); } Arrays.sort(keyvals); for(int x:keyvals) { glpack temp = (glpack)sBuffer.get(x); if(!temp.issent()) { temp.sent(); synchronized(sBuffer) { sBuffer.remove(x); sBuffer.put(x,temp); } return temp.getString(); } } return null; } public synchronized void cleansBuff() { int i=0; int[] seq = null; Iterator keys = null; synchronized(sBuffer) { seq = new int[sBuffer.size()]; keys = sBuffer.keySet().iterator(); } while(keys.hasNext()) { seq[i++] = ((Integer)keys.next()); } Arrays.sort(seq); for(int x:seq) { glpack temp = (glpack)sBuffer.get(x); if(temp.isunmark(1)&&temp.isunmark(2)) { synchronized(sBuffer) { sBuffer.remove(x); } } } } public synchronized void cleanrBuff() { int i=0; int[] seq = null; Iterator keys = null; synchronized(sBuffer) { seq = new int[rBuffer.size()]; keys = rBuffer.keySet().iterator(); } while(keys.hasNext()) { seq[i++] = ((Integer)keys.next()); } Arrays.sort(seq); for(int x:seq) { glpack temp = (glpack)rBuffer.get(x); if(temp.isunmark(0)&&temp.isunmark(1)&&temp.isunmark(2)) { synchronized(sBuffer) { int freed = temp.getpacket().size(); rBuffer.remove(x); pMaker.mywin+=freed; } } } } } class server extends Thread { myBuffers mBuffer; public server(myBuffers getit) { mBuffer = getit; } public void run() { DatagramSocket sSocket =null; try { sSocket = new DatagramSocket(4994); } catch(Exception e) { //System.out.println("Cant open socket"); } byte[] rData = new byte[1500]; packet mpack = null; DatagramPacket rPacket = null; while(true) { //Arrays.fill(rData,null); try { rPacket = new DatagramPacket(rData,rData.length); sSocket.receive(rPacket); controller.IP = (rPacket.getAddress()).getHostAddress(); } catch(Exception e) { //System.out.println("Fuxxing errors"); } controller.condition = true; byte[] answer = new byte[rPacket.getLength()]; for(int i=0;i= 192) { //s.showString("Source: "); switch (s.findflag()) { case 0: //received data, send ACK data = ""; //System.out.println("received data, return ACK"); ano = s.findseqno(); gpack.cPacket(s.finddport(), s.findsport(), s.findackno(), ++ano, 16, mywin, data); seqNumber = s.findackno()+1; //changed all ack, to accomodate the multiple ACK issue break; case 1: //received FIN, return ACK data = ""; //System.out.println("received FIN, return ACK"); closing_seq = true; // probably correct ano = s.findseqno(); gpack.cPacket(s.finddport(), s.findsport(), (s.findackno()+1), ++ano, 16, mywin, data); seqNumber = s.findackno()+1; break; case 2: //received SYN, return SYN+ACK //System.out.println("received SYN, return SYN+ACK"); data = ""; ano = s.findseqno(); gpack.cPacket(s.finddport(), s.findsport(), seqNumber++, ++ano, 18, mywin, data); break; case 18: //received SYN+ACK, return ACK, done by client if(!sar) { data = "handshake"; ano = s.findseqno(); gpack.cPacket(s.finddport(), s.findsport(), seqNumber++, ++ano, 16, mywin, data); //System.out.println("MADE"); seqNumber = s.findackno()+1; sar = true; //System.out.println("received SYN+ACK, return ACK of type" + gpack.findflag()); } else { br = new BufferedReader(new FileReader("send.txt")); tempBuffer = new char[value-192]; try { br.read(tempBuffer, offset, value-192); //read byte by byte } catch(IOException e) { //System.out.println("IOException, It's normal as file is over"); } offset = offset + value-192; //update the start pointer, is it the correct place, or put it in try block? data = new String(tempBuffer); // data from file ////System.out.println("received ACK, send next packet"); if(anob) return b; return a; } public void run() { packet last = null; switch(mode) { case 0: packet mpack = null; while(true) { packet s = null; //System.out.println("Sending syn "); mpack = new packet(); mpack.cPacket(1337,4994,seqNumber++,0,2,mywin,""); //mpack.showStrings(""); mBuffer.writesBuff(mpack); while(true) { s=null; while(s==null) { //System.out.println("Waiting"); try { Thread.sleep(100); } catch(Exception e){} s =mBuffer.fetchrBuff(0); } ////System.out.println("Wait Over" + s); if(last == null) last = s; if(s.findseqno()=conjested) { //System.out.println("Conjested"); try { Thread.sleep(500); } catch(Exception e){} break; } int value = min(winsize - spacksize,1000); //xxx++; packet p = null; try { ////System.out.println() //System.out.print("Attempting to create on "); //s.showStrings(""); p = makepacket(s,value); ////System.out.println("made syn/data "+xxx); } catch(Exception e) { //System.out.println(e.getMessage()); } if(p!=null) { spacksize+=p.size(); mBuffer.writesBuff(p); nbr++; } else { //System.out.println("Failed creating " + value); s=null; break; } } } } case 1: while(true) { packet s = null; while(s==null) { try { Thread.sleep(100); } catch(Exception e){} //System.out.println("Awaiting"); s = mBuffer.fetchrBuffseq(0); } // if(last!=null) // if(s.findseqno()0) { IP = args[0]; mypMaker= new pMaker(1,bfr); } else mypMaker= new pMaker(bfr); server myserver = new server(bfr); client myclient = new client(bfr); cleaner mycleaner = new cleaner(bfr); preciever mypreciever = new preciever(bfr); concontrol myconcontrol = new concontrol(bfr); //showBuffer displays = new showBuffer(bfr); //displays.start(); mypMaker.start(); myserver.start(); myclient.start(); mycleaner.start(); mypreciever.start(); myconcontrol.start(); } }