diff --git a/source/Cosmos.System2/Network/IPv4/TCP/TCPClient.cs b/source/Cosmos.System2/Network/IPv4/TCP/TCPClient.cs index 570cee12c..f8eb93c1f 100644 --- a/source/Cosmos.System2/Network/IPv4/TCP/TCPClient.cs +++ b/source/Cosmos.System2/Network/IPv4/TCP/TCPClient.cs @@ -119,15 +119,13 @@ namespace Cosmos.System.Network.IPv4.TCP /// /// Destination address. /// Destination port. - public void Connect(Address dest, int destPort, int timeout = 5000) + public bool Connect(Address dest, int destPort, int timeout = 5000) { destination = dest; destinationPort = destPort; source = IPConfig.FindNetwork(dest); - global::System.Console.WriteLine(source.ToString()); - byte[] options = new byte[] { 0x02, 0x04, 0x05, 0xB4, 0x01, 0x03, 0x03, 0x08, 0x01, 0x01, 0x04, 0x02 @@ -138,15 +136,15 @@ namespace Cosmos.System.Network.IPv4.TCP ulong sequencenumber = (ulong)((rnd.Next(0, Int32.MaxValue)) << 32) | (ulong)(rnd.Next(0, Int32.MaxValue)); // Flags=0x02 -> Syn - var packet = new TCPPacket(source, dest, (ushort)localPort, (ushort)destPort, sequencenumber, 0, (ushort)(20 + options.Length), 0x02, 0xFAF0, 0, (ushort)options.Length, options); + var packet = new TCPPacket(source, destination, (ushort)localPort, (ushort)destPort, sequencenumber, 0, (ushort)(20 + options.Length), 0x02, 0xFAF0, 0, (ushort)options.Length, options); OutgoingBuffer.AddPacket(packet); NetworkStack.Update(); - WaitForConnectionResponse(timeout); + return WaitForConnectionResponse(timeout); } - private void WaitForConnectionResponse(int timeout) + private bool WaitForConnectionResponse(int timeout) { int second = 0; int _deltaT = 0; @@ -155,7 +153,7 @@ namespace Cosmos.System.Network.IPv4.TCP { if (second > (timeout / 1000)) { - return; + return false; } if (_deltaT != RTC.Second) { @@ -164,24 +162,30 @@ namespace Cosmos.System.Network.IPv4.TCP } } - var packet = new TCPPacket(rxBuffer.Dequeue().RawData); + var packet = rxBuffer.Dequeue(); if (packet.Flags == 0x12) // SYN/ACK { SendAck(packet); + + Global.mDebugger.Send("TCP Connection established!"); + + Connected = true; + + return true; + } + else + { + return false; } } private void SendAck(TCPPacket responsepacket) { - var packet = new TCPPacket(source, destination, (ushort)localPort, (ushort)localPort, responsepacket.AckNumber, responsepacket.SequenceNumber + 1, 20, 0x10, 0xFAF0, 0, 0); + var packet = new TCPPacket(source, destination, (ushort)localPort, (ushort)localPort, responsepacket.AckNumber, responsepacket.SequenceNumber + 1, 20, 0x10, 0xFAF0, 0); OutgoingBuffer.AddPacket(packet); NetworkStack.Update(); - - Global.mDebugger.Send("TCP Connection established!"); - - Connected = true; } /// diff --git a/source/Cosmos.System2/Network/IPv4/TCP/TCPPacket.cs b/source/Cosmos.System2/Network/IPv4/TCP/TCPPacket.cs index f60521e54..f84031789 100644 --- a/source/Cosmos.System2/Network/IPv4/TCP/TCPPacket.cs +++ b/source/Cosmos.System2/Network/IPv4/TCP/TCPPacket.cs @@ -226,29 +226,25 @@ namespace Cosmos.System.Network.IPv4.TCP /// byte array value. internal byte[] MakeHeader() { - /* Pseudo Header */ byte[] header = new byte[12 + (RawData.Length - DataOffset)]; + /* Pseudo Header */ //Addresses for (int b = 0; b < 4; b++) { header[0 + b] = SourceIP.address[b]; header[4 + b] = DestinationIP.address[b]; } - //Reserved header[8] = 0x00; - //Protocol (TCP) header[9] = 0x06; - ushort tcplen = (ushort)(RawData.Length - DataOffset); - //TCP Length header[10] = (byte)((tcplen >> 8) & 0xFF); header[11] = (byte)((tcplen >> 0) & 0xFF); - /** TCP Packet **/ + /* TCP Packet */ for (int i = 0; i < RawData.Length - DataOffset; i++) { header[12 + i] = RawData[DataOffset + i];