ty for try helping ,the code is large so i just ignore some unimportant methods and unimportant OPcodes like 0xA100,0x2322,0xA103,0x6323.... and so on , if it still not enough i can upload the full project .
Ty again for response and sry for the bad design.
Code:
static private Socket s;
static private TransferBuffer recv_buffer = new TransferBuffer(4096, 0, 0);
static private Security security = new Security();
static private List<Packet> packets = new List<Packet>();
public void beginconnect(string ips,int port) \\ this method for intiate the TCP session ;
{
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(ips);
bool stoploop = false;
while (stoploop == false)
{
try
{
s.Connect(ip, port);
s.Blocking = false;
s.NoDelay = true;
stoploop = true;
//GUI.Debugmsg("Intiate TCP Session ......");
}
catch
{
GUI.Debugmsg("Intiate TCP Session Failed !");
Thread.Sleep(3000);
stoploop = false;
}
Thread.Sleep(1000);
}
}
public void DoRecv() \\\\ tell the program to start receving
{
SocketError err;
while (Stop_recv == false )
{
recv_buffer.Size = s.Receive(recv_buffer.Buffer, 0, recv_buffer.Buffer.Length, SocketFlags.None, out err);
if (err !=SocketError.Success)
{
if (err !=SocketError.WouldBlock)
{
GUI.Debugmsg("TCP Disconnected !" + err);
Restartconnection();
break;
}
}
else
{
if (recv_buffer.Size > 0)
{
security.Recv(recv_buffer);
}
//else
//{
// GUI.Debugmsg("TCP Not receiving Error !");
// Restartconnection();
// break;
//}
}
///////////////////////////////////////////////////
List<Packet> tmp_packets = security.TransferIncoming();
if (tmp_packets != null)
{
packets.AddRange(tmp_packets);
}
if (packets.Count>0)
{
RX_login()
}
Thread.Sleep(10);
}
}
private void RX_login() \\\\\ contain the received packets and switch the opcode to find the response
{
foreach (Packet packet in packets)
{
switch (packet.Opcode)
{
case 0x2001:
string gate = packet.ReadAscii();
if (gate =="GatewayServer")
{
TX_response(0x6100,true,false);
//GUI.Debugmsg("6100 !");
}
if (gate=="AgentServer")
{
TX_response(0x6103, true, false);
GUI.Debugmsg("Redirected !");
}
break;
case 0xA102:
byte result = packet.ReadUInt8();
if (result==0x01)
{
ID = packet.ReadUInt32();
IP = packet.ReadAscii();
port = packet.ReadUInt16();
IPAdress _ip = IPAdress.parse(IP
s.connect(_ip,port);
GUI.Debugmsg("0XA102");
}
else
{
GUI.Debugmsg("Failed to Login !");
}
break;
}
DoSend();
}
private void TX_response(ushort opcode,bool Encrypt,bool Massive) ////// contain the response function to the received Packets
{
Packet response = new Packet(opcode, Encrypt, Massive);
switch (opcode)
{
case 0x6100 :
response.WriteUInt8(0x16);
response.WriteAscii("SR_Client");
response.WriteUInt32(0x2E01);
break;
case 0x6103 :
response.WriteUInt32(ID);
response.WriteAscii(Globals.username);
response.WriteAscii(Globals.Password);
response.WriteUInt8(0x16);
response.WriteUInt32(0);
response.WriteUInt16(0);
break;
}
security.Send(response);
}
private void DoSend() \\\\\\\\\\\ Transfer the packets from Silkroadsecurity APi to send it
{
List<KeyValuePair<TransferBuffer, Packet>> tmp_buffers = security.TransferOutgoing();
if (tmp_buffers != null)
{
foreach (var kvp in tmp_buffers)
{
TransferBuffer buffer = kvp.Key;
Packet packet = kvp.Value;
SocketError err = SocketError.Success;
while (buffer.Offset != buffer.Size)
{
byte[] packet_bytes = packet.GetBytes();
int sent = s.Send(buffer.Buffer, buffer.Offset, buffer.Size - buffer.Offset, SocketFlags.None, out err);
if (err != SocketError.Success)
{
if (err != SocketError.WouldBlock)
{
// error ///////////////////
break;
}
}
buffer.Offset += sent;
Thread.Sleep(10);
}
}