Click here to Skip to main content
15,886,919 members
Home / Discussions / C#
   

C#

 
AnswerRe: using Same Shortcut keys on Different Tabs of a form Pin
Liam Cairns Kelly13-Aug-12 9:30
Liam Cairns Kelly13-Aug-12 9:30 
Questionread and org data in c# Pin
Xarzu12-Aug-12 23:42
Xarzu12-Aug-12 23:42 
AnswerRe: read and org data in c# Pin
Eddy Vluggen13-Aug-12 0:33
professionalEddy Vluggen13-Aug-12 0:33 
QuestionOverriding the DefaultValueAttribute of an inherited property Pin
Bernhard Hiller12-Aug-12 20:51
Bernhard Hiller12-Aug-12 20:51 
AnswerRe: Overriding the DefaultValueAttribute of an inherited property Pin
DaveyM6913-Aug-12 0:19
professionalDaveyM6913-Aug-12 0:19 
GeneralRe: Overriding the DefaultValueAttribute of an inherited property Pin
Bernhard Hiller13-Aug-12 1:01
Bernhard Hiller13-Aug-12 1:01 
GeneralRe: Overriding the DefaultValueAttribute of an inherited property Pin
DaveyM6913-Aug-12 1:27
professionalDaveyM6913-Aug-12 1:27 
QuestionA simple proxy server in C# Pin
Prahlad Yeri12-Aug-12 1:41
Prahlad Yeri12-Aug-12 1:41 
I have written a simple and minimalist HTTP proxy server that runs on command line. In the Start() method, a TcpListener blocks until it gets a client request and creates a new thread (ThreadHandleClient method) that processes this client, fetches its url and relays data.

The trouble is in the relay logic that I want to refine. In the first inner loop, I receive all webserver data and send it to client until zero bytes are left. In second inner loop, I do vice-versa: receive all client data and send to web-server until zero bytes left. However, the code gets blocked in the beginning of second inner-loop at client.receive(). This is what I'm basically doing:

Any help will be truly appreciated. Thanks in advance.

C#
public void Start(IPAddress ip, int port)
    {
    try
    {
    TcpListener listener = new TcpListener(ip, port);
    listener.Start(100);
    while (!stopFlag)
    {
    Socket client = listener.AcceptSocket();
    IPEndPoint rep = (IPEndPoint)client.RemoteEndPoint;
    Thread th = new Thread(ThreadHandleClient);
    th.Start(client);
    }
    listener.Stop();
    }
    catch (Exception ex)
    {
    Debug.Print("START: " + ex.Message);
    }
    }
    public void ThreadHandleClient(object o)
    {
    try
    {
    Socket client = (Socket)o;
    NetworkStream ns = new NetworkStream(client);
    //RECEIVE CLIENT DATA
    byte[] buffer = new byte[2048];
    int rec = 0, sent = 0, transferred = 0, rport = 0;
    string data = "";
    do
    {
    rec = ns.Read(buffer, 0, buffer.Length);
    data += Encoding.ASCII.GetString(buffer, 0, rec);
    } while (rec == buffer.Length);
    //PARSE DESTINATION AND SEND REQUEST
    string line = data.Replace("\r\n", "\n").Split(new string[] { "\n" }, StringSplitOptions.None)[0];
    Uri uri = new Uri(line.Split(new string[] { " " }, StringSplitOptions.None)[1]);
    Debug.Print("CLIENT REQUEST RECEIVED: " + uri.OriginalString);
    if (uri.Scheme == "https")
    {
    rport = 443;
    Debug.Print("HTTPS - 443");
    }
    else
    {
    rport = 80;
    Debug.Print("HTTP - 443");
    }
    IPHostEntry rh = Dns.GetHostEntry(uri.Host);
    Socket webserver = new Socket(rh.AddressList[0].AddressFamily, SocketType.Stream, ProtocolType.IP);
    webserver.Connect(new IPEndPoint(rh.AddressList[0], rport));
    byte[] databytes = Encoding.ASCII.GetBytes(data);
    webserver.Send(databytes, databytes.Length, SocketFlags.None);
    Debug.Print("SENT TO SERVER. WILL NOW RELAY: " + data);
    //START RELAY
    buffer = new byte[2048];
    rec = 0;
    data = "";
    do
    {
    transferred = 0;
    do
    {
    rec = webserver.Receive(buffer, buffer.Length, SocketFlags.None);
    Debug.Print("RECEIVED FROM WEBSERVER[" + rec.ToString() + "]: " + Encoding.ASCII.GetString(buffer, 0, rec));
    sent = client.Send(buffer, rec, SocketFlags.None);
    Debug.Print("SENT TO CLIENT[" + sent.ToString() + "]: " + Encoding.ASCII.GetString(buffer, 0, rec));
    transferred += rec;
    //data += Encoding.ASCII.GetString(serverbytes, 0, rec);
    } while (rec == buffer.Length);
    Debug.Print("loop-1 finished");
    if (transferred == 0)
    break;
    transferred = 0;
    do
    {
    rec = client.Receive(buffer, buffer.Length, SocketFlags.None);
    Debug.Print("RECEIVED FROM CLIENT: " + Encoding.ASCII.GetString(buffer, 0, rec));
    sent = webserver.Send(buffer, rec, SocketFlags.None);
    Debug.Print("SENT TO WEBSERVER[" + sent.ToString() + "]: " + Encoding.ASCII.GetString(buffer, 0, rec));
    transferred += rec;
    } while (rec == buffer.Length);
    Debug.Print("loop-2 finished");
    } while (transferred > 0);
    Debug.Print("LOOP ENDS. EXITING THREAD");
    }
    catch (Exception ex)
    {
    Debug.Print("Error occured: " + ex.Message);
    }

AnswerRe: A simple proxy server in C# Pin
Richard Andrew x6412-Aug-12 4:17
professionalRichard Andrew x6412-Aug-12 4:17 
GeneralRRe: A simple proxy server in C# Pin
Prahlad Yeri12-Aug-12 5:07
Prahlad Yeri12-Aug-12 5:07 
GeneralRe: RRe: A simple proxy server in C# Pin
Richard Andrew x6412-Aug-12 5:25
professionalRichard Andrew x6412-Aug-12 5:25 
GeneralRe: RRe: A simple proxy server in C# Pin
Prahlad Yeri12-Aug-12 5:31
Prahlad Yeri12-Aug-12 5:31 
GeneralRe: RRe: A simple proxy server in C# Pin
Richard Andrew x6412-Aug-12 5:36
professionalRichard Andrew x6412-Aug-12 5:36 
GeneralRe: RRe: A simple proxy server in C# Pin
Prahlad Yeri12-Aug-12 6:18
Prahlad Yeri12-Aug-12 6:18 
QuestionTracking system Pin
kipchirchir11-Aug-12 20:52
kipchirchir11-Aug-12 20:52 
AnswerRe: Tracking system Pin
OriginalGriff11-Aug-12 21:17
mveOriginalGriff11-Aug-12 21:17 
AnswerRe: Tracking system Pin
Richard MacCutchan11-Aug-12 21:46
mveRichard MacCutchan11-Aug-12 21:46 
QuestionXDocument.Save() reversing attribute order Pin
Nukeman3311-Aug-12 2:03
Nukeman3311-Aug-12 2:03 
QuestionRe: XDocument.Save() reversing attribute order Pin
Eddy Vluggen11-Aug-12 2:22
professionalEddy Vluggen11-Aug-12 2:22 
AnswerRe: XDocument.Save() reversing attribute order Pin
Dave Kreskowiak11-Aug-12 4:13
mveDave Kreskowiak11-Aug-12 4:13 
AnswerRe: XDocument.Save() reversing attribute order Pin
jschell11-Aug-12 7:35
jschell11-Aug-12 7:35 
AnswerRe: XDocument.Save() reversing attribute order Pin
Abhinav S11-Aug-12 18:59
Abhinav S11-Aug-12 18:59 
Questionhow to create multiple countdown timer in one page in asp.net Pin
Sumit Malviya10-Aug-12 23:05
Sumit Malviya10-Aug-12 23:05 
AnswerRe: how to create multiple countdown timer in one page in asp.net Pin
Eddy Vluggen10-Aug-12 23:51
professionalEddy Vluggen10-Aug-12 23:51 
QuestionSQL + C# Pin
jojoba201110-Aug-12 21:42
jojoba201110-Aug-12 21:42 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.