mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-24 12:35:31 +00:00
TCP work
This commit is contained in:
parent
f3c3aeb1d3
commit
e25394e01d
2 changed files with 19 additions and 19 deletions
|
|
@ -119,15 +119,13 @@ namespace Cosmos.System.Network.IPv4.TCP
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dest">Destination address.</param>
|
/// <param name="dest">Destination address.</param>
|
||||||
/// <param name="destPort">Destination port.</param>
|
/// <param name="destPort">Destination port.</param>
|
||||||
public void Connect(Address dest, int destPort, int timeout = 5000)
|
public bool Connect(Address dest, int destPort, int timeout = 5000)
|
||||||
{
|
{
|
||||||
destination = dest;
|
destination = dest;
|
||||||
destinationPort = destPort;
|
destinationPort = destPort;
|
||||||
|
|
||||||
source = IPConfig.FindNetwork(dest);
|
source = IPConfig.FindNetwork(dest);
|
||||||
|
|
||||||
global::System.Console.WriteLine(source.ToString());
|
|
||||||
|
|
||||||
byte[] options = new byte[]
|
byte[] options = new byte[]
|
||||||
{
|
{
|
||||||
0x02, 0x04, 0x05, 0xB4, 0x01, 0x03, 0x03, 0x08, 0x01, 0x01, 0x04, 0x02
|
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));
|
ulong sequencenumber = (ulong)((rnd.Next(0, Int32.MaxValue)) << 32) | (ulong)(rnd.Next(0, Int32.MaxValue));
|
||||||
|
|
||||||
// Flags=0x02 -> Syn
|
// 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);
|
OutgoingBuffer.AddPacket(packet);
|
||||||
NetworkStack.Update();
|
NetworkStack.Update();
|
||||||
|
|
||||||
WaitForConnectionResponse(timeout);
|
return WaitForConnectionResponse(timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void WaitForConnectionResponse(int timeout)
|
private bool WaitForConnectionResponse(int timeout)
|
||||||
{
|
{
|
||||||
int second = 0;
|
int second = 0;
|
||||||
int _deltaT = 0;
|
int _deltaT = 0;
|
||||||
|
|
@ -155,7 +153,7 @@ namespace Cosmos.System.Network.IPv4.TCP
|
||||||
{
|
{
|
||||||
if (second > (timeout / 1000))
|
if (second > (timeout / 1000))
|
||||||
{
|
{
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
if (_deltaT != RTC.Second)
|
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
|
if (packet.Flags == 0x12) // SYN/ACK
|
||||||
{
|
{
|
||||||
SendAck(packet);
|
SendAck(packet);
|
||||||
|
|
||||||
|
Global.mDebugger.Send("TCP Connection established!");
|
||||||
|
|
||||||
|
Connected = true;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendAck(TCPPacket responsepacket)
|
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);
|
OutgoingBuffer.AddPacket(packet);
|
||||||
NetworkStack.Update();
|
NetworkStack.Update();
|
||||||
|
|
||||||
Global.mDebugger.Send("TCP Connection established!");
|
|
||||||
|
|
||||||
Connected = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
||||||
|
|
@ -226,29 +226,25 @@ namespace Cosmos.System.Network.IPv4.TCP
|
||||||
/// <returns>byte array value.</returns>
|
/// <returns>byte array value.</returns>
|
||||||
internal byte[] MakeHeader()
|
internal byte[] MakeHeader()
|
||||||
{
|
{
|
||||||
/* Pseudo Header */
|
|
||||||
byte[] header = new byte[12 + (RawData.Length - DataOffset)];
|
byte[] header = new byte[12 + (RawData.Length - DataOffset)];
|
||||||
|
|
||||||
|
/* Pseudo Header */
|
||||||
//Addresses
|
//Addresses
|
||||||
for (int b = 0; b < 4; b++)
|
for (int b = 0; b < 4; b++)
|
||||||
{
|
{
|
||||||
header[0 + b] = SourceIP.address[b];
|
header[0 + b] = SourceIP.address[b];
|
||||||
header[4 + b] = DestinationIP.address[b];
|
header[4 + b] = DestinationIP.address[b];
|
||||||
}
|
}
|
||||||
|
|
||||||
//Reserved
|
//Reserved
|
||||||
header[8] = 0x00;
|
header[8] = 0x00;
|
||||||
|
|
||||||
//Protocol (TCP)
|
//Protocol (TCP)
|
||||||
header[9] = 0x06;
|
header[9] = 0x06;
|
||||||
|
|
||||||
ushort tcplen = (ushort)(RawData.Length - DataOffset);
|
ushort tcplen = (ushort)(RawData.Length - DataOffset);
|
||||||
|
|
||||||
//TCP Length
|
//TCP Length
|
||||||
header[10] = (byte)((tcplen >> 8) & 0xFF);
|
header[10] = (byte)((tcplen >> 8) & 0xFF);
|
||||||
header[11] = (byte)((tcplen >> 0) & 0xFF);
|
header[11] = (byte)((tcplen >> 0) & 0xFF);
|
||||||
|
|
||||||
/** TCP Packet **/
|
/* TCP Packet */
|
||||||
for (int i = 0; i < RawData.Length - DataOffset; i++)
|
for (int i = 0; i < RawData.Length - DataOffset; i++)
|
||||||
{
|
{
|
||||||
header[12 + i] = RawData[DataOffset + i];
|
header[12 + i] = RawData[DataOffset + i];
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue