Новичок
Регистрация: 06.12.2010
Сообщений: 18
Сказал Спасибо: 1
Имеет 0 спасибок в 0 сообщенях
|
Цитата:
Сообщение от Deadly
работает с линейкой прекрасно хоть и написан криво(писался давно)
|
Ну не совсем прекрасно, при попытке подключится к гейм серверу он перестает работать, ибо Accept для нового подключения не вызывается.
Вот мой вариант, правда никак руки не доходят пробросить делегаты для редактирования пакетов
Код:
class SocksProxy
{
public int Port;
public SocksProxy(int port)
{
this.Port = port;
}
public void Listen()
{
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(new IPEndPoint(IPAddress.Any, Port));
listener.Listen(100);
listener.BeginAccept(listener_Accept, listener);
}
private void listener_Accept(IAsyncResult ar)
{
string remoteIP = string.Empty;
int remotePort = 0;
byte[] buffer = new byte[2048];
Socket temp = (Socket)ar.AsyncState;
temp.BeginAccept(listener_Accept, temp);
Socket _in = temp.EndAccept(ar);
Socket _out = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_in.Receive(buffer, 0, buffer.Length, SocketFlags.None);
if (buffer[0] == 5 && buffer[1] == 1 && buffer[2] == 0)
{
buffer[1] = 0;
_in.Send(buffer, 0, 2, SocketFlags.None);
_in.Receive(buffer, 0, buffer.Length, SocketFlags.None);
if (buffer[3] == 1)
{
remoteIP = buffer[4] + "." + buffer[5] + "." + buffer[6] + "." + buffer[7];
remotePort = buffer[8]*256 + buffer[9];
Console.WriteLine("Socket connected to " + remoteIP + ":" + remotePort);
}
buffer[1] = 0;
_in.Send(buffer, 0, 10, SocketFlags.None);
}
_out.Connect(new IPEndPoint(IPAddress.Parse(remoteIP), remotePort)); // подключаемся к серверу ла2
NetworkState state = new NetworkState(_in, _out, buffer);
_out.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, out_Receive, state);
_in.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, in_Receive, state);
}
private void in_Receive(IAsyncResult ar) //получили пакет от клиента
{
NetworkState state = (NetworkState)ar.AsyncState;
int received = state.In.EndReceive(ar);
if (received > 0)
{
Console.WriteLine("{0} -> {1}", state.In.RemoteEndPoint, state.Out.RemoteEndPoint);
Console.WriteLine(Utils.HexDump(state.Buffer, received));
state.Out.Send(state.Buffer, 0, received, SocketFlags.None); // отправили серверу
state.In.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, in_Receive,
new NetworkState(state.In, state.Out, state.Buffer));
}
else
{
state.In.Shutdown(SocketShutdown.Both);
Console.WriteLine("{0} отключен", state.In.RemoteEndPoint);
}
}
private void out_Receive(IAsyncResult ar) //получили пакет от сервера
{
NetworkState state = (NetworkState)ar.AsyncState;
int received = state.Out.EndReceive(ar);
if (received > 0)
{
Console.WriteLine("{0} -> {1}", state.Out.RemoteEndPoint, state.In.RemoteEndPoint);
Console.WriteLine(Utils.HexDump(state.Buffer, received));
state.In.Send(state.Buffer, 0, received, SocketFlags.None); // отправили проксификатору
state.Out.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, out_Receive,
new NetworkState(state.In, state.Out, state.Buffer));
}
else
{
state.Out.Shutdown(SocketShutdown.Both);
Console.WriteLine("{0} отключен", state.Out.RemoteEndPoint);
}
}
}
class NetworkState
{
public byte[] Buffer;
public Socket In;
public Socket Out;
public NetworkState(Socket sin, Socket sout,byte[] buff)
{
this.Buffer = buff;
this.In = sin;
this.Out = sout;
}
}
Последний раз редактировалось Sinn3r, 23.02.2013 в 06:20.
Причина: картинка
|