Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Modyfikacja odpowiedzi serwera


Rekomendowane odpowiedzi

Opublikowano

Cześć, chciałbym edytować odpowiedź serwera, zanim zostanie ona zinterpretowana przez przeglądarkę (Firefox). Jak się za to zabrać? Jest mi to potrzebne na moim komputerze więc można pozmieniać ustawienia jeżeli będzie taka potrzeba. Może jakieś lokalne proxy czy coś?

giphy.gif

Opublikowano

Ustaw proxy na 127.0.0.1:4567, w c# zrób serwer tcp na tym porcie, wyślij dane od przeglądarki do docelowego serwera za pomocą socketa, jeżeli adres strony jest właściwy, to zmień treść.

  • 2 tygodnie później...
Opublikowano

Ustaw proxy na 127.0.0.1:4567, w c# zrób serwer tcp na tym porcie, wyślij dane od przeglądarki do docelowego serwera za pomocą socketa, jeżeli adres strony jest właściwy, to zmień treść.

 

Co można poprawić? Obecnie chodzi mi o samą metodę Get. Na niektórych stronach jest problem z polskimi znakami.

 

https://codeshare.io/imUj8

giphy.gif

Opublikowano

 

Ustaw proxy na 127.0.0.1:4567, w c# zrób serwer tcp na tym porcie, wyślij dane od przeglądarki do docelowego serwera za pomocą socketa, jeżeli adres strony jest właściwy, to zmień treść.

 

Co można poprawić? Obecnie chodzi mi o samą metodę Get. Na niektórych stronach jest problem z polskimi znakami.

 

https://codeshare.io/imUj8

 

Możesz to zrobić np. tak

//
/*   Server Program    */

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;

public class ServerTCP
{
	public static void Main()
	{
		try
		{
			IPAddress ipAd = IPAddress.Parse("127.0.0.1");
			TcpListener myList = new TcpListener(IPAddress.Any, 4567);

			myList.Start();

			while (true)
			{
				Socket s = myList.AcceptSocket();

				new Task(() => handleSocket(s)).Start();			
			}

		}
		catch (Exception e)
		{
			Console.WriteLine("Error..... " + e.StackTrace);
		}
	}

	private static void handleSocket(Socket s)
	{
		var buffer = new byte[1024 * 1024];
		var bytesCount = s.Receive(buffer, 0, buffer.Length, SocketFlags.None);
		var strReequestData = Encoding.UTF8.GetString(buffer, 0, bytesCount);

		var requestData = strReequestData.Split('\n');
		string host = string.Empty;
		for (var i = 0; i < requestData.Length; i++)
		{
			var header = requestData[i].Trim();

			if (header.StartsWith("Accept-Encoding:"))
			{
				requestData[i] = "";
			}
			else if (header.StartsWith("Host:"))
			{
				host = header.Split(' ')[1];
			}
		}

		if (string.IsNullOrEmpty(host))
		{
#if DEBUG
			Console.WriteLine("Brak HOST: " + strReequestData);
#endif
			s.Disconnect(false);
			return;
		}

		Console.WriteLine("REQUEST {0}", host);

		var data = Encoding.UTF8.GetBytes(String.Join("\n", requestData));
		var response = request(data, host, s);
		if (response != null)		
			s.Send(response);
		s.Disconnect(false);
		s.Close();
	}
	
	private static byte[] request(byte[] data, string host, Socket s2, int port = 80)
	{
		try
		{
			var s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
			s.Connect(host, port);

			s.Send(data);

			var lista = new List<byte>();
			int recv = 0, total = 0;
			var buffer = new byte[4096];
			while ((recv = s.Receive(buffer, 0, buffer.Length, SocketFlags.None)) != 0)
			{
				for (var i = 0; i < recv; i++)
					lista.Add(buffer[i]);
				total += recv;
			}
			s.Disconnect(false);

			return lista.ToArray();
		}
		catch (Exception ex)
		{
#if DEBUG
			Console.WriteLine("request -> " + ex);
#endif
			return null;
		}
	}
}
i nie będziesz musiał obsługiwać requestów własnoręcznie.
Opublikowano

@Pan Szymek Dzięki prawie wszystko działa. Tylko mam problem z zamianą tablicy bajtów na string i w drugą stronę:

        var response = request(data, host, s);
        string responseString = System.Text.Encoding.UTF8.GetString(response);
       response = Encoding.UTF8.GetBytes(responseString);
        if (response != null)
            s.Send(response);

giphy.gif

Opublikowano

Mam problem z protokołem SSL:
https://codeshare.io/daJYf

giphy.gif

Opublikowano

 

Czy powinienem zrobić oddzielny serwer dla SSL?

giphy.gif

Opublikowano

@Pan Szymek Siedziałem wczoraj i dzisiaj od rana i próbuję ale nadal nie wiem jak to zrobić. Czy obsługa SSL w moim przypadku jest, aż tak trudna? Znalazłem kilka gotowych serwerów ich kod był długi i skomplikowany jak dla mnie, a w dodatku proxy i tak nie działało. Połączenie zostało zresetowane itp.

 

Jak próbuję odczytać z NetworkStream, to coś się zawiesza i odblokowuje dopiero po ponownym rozpoczęciu ładowania URL w tej samej karcie:

     string strReequestData;

      using (networkStream)
      {
            byte[] data = new byte[1024];
            using (MemoryStream ms = new MemoryStream())
            {

                int numBytesRead ;
                while ((numBytesRead = networkStream.Read(data, 0, data.Length)) > 0)
                {
                    ms.Write(data, 0, numBytesRead);
                    if (numBytesRead < data.Length)
                    {
                        break;
                    }
                }
               strReequestData = Encoding.UTF8.GetString(ms.ToArray(), 0, (int)ms.Length);
            }
        }

giphy.gif

Opublikowano

Znalazłem odpowiedni projekt, gdyby ktoś kiedyś potrzebował:

http://trotinet.sourceforge.net/

Dużo czasu mi to zajęło ale zdobyta wiedza o TCP/IP pewnie jeszcze kiedy się przyda. :)

giphy.gif

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...