kluczowa fraza brzmi 'transparent http proxy' albo "transparent sockets proxy'..
Generalnie, bedziesz tutaj mial dwa problemy:
- napisac sciagarke po http respektujaca jego specyfike (kody 3xx, 4xx, 5xx..)
- napisac miniserwer http
problem mniejszy brzmi - NIE WYSLESZ po http strumienia do uzytkownika w sposob aktywny. To uzytkownik musi wpierw sprobowac polaczyc sie z Twoja sciagarka/proxy, nie ona do niego.
Jak juz uda Ci sie miec w reku dwa polczenia - jedno do zrodla, drugie do odbiorcy - zakladam ze uzywasz socketow, ale moze byc to cokolwiek - cala reszta jest trywialna: tworzysz maly/sredni bufor w pamieci, np. char buf[1024] (chociaz dopasowany do wielkosci ramki bylby lepszy), i jak tylko blokujacy recv(socket_in, bufor, .., ...) czytajacy z oryginalnego zrodla sie wykona, natychmiast wykonuj send(socket_out, bufor, ..., ...), zamkniete w petli while:
unsigned char bufor[1024];
while(....)
{
recv(socket_in, bufor, ..., ...)
send(socket_out, bufor, ..., ...)
}
socket specific warning:
A) defaultowo sockety maja to do siebie, ze recv jest blokujacy, a send - nie. To znaczy, ze jedyne "spanie" odbywa sie na czekaniu na odbior paczki, a wypchniecie odebranej paczki jest natychmiastowe i od razu przechodzi sie do czekania na nastepna partie danych.. Odbierasz partiami po 1kB lub troche wiekszymi, wiec przestojow zwiazanych z czekaniem na zapelnienie bufora raczej nie bedzie.
B) specyfika send/recv jest jednak wredniejsza, i one, uwaga, wcale nie musza wyslac/odebrac tylu danych ile im nakazales, i nie oznacza to bledu albo zerwania polaczenia. nalezy za kazdym odpaleniem send czy recv sprawdzac ile pracy faktycznie wykonaly i jesli sie zdarzy ze wysla/odbiora mniej niz mialy - musisz sobie z tym nalezycie poradzic recznie. powyzszy dwulinijkowy "kod" wewnatrz while moze dzialac, ale nie musi. Aby dziala na pewno, musisz go rozbudowac o przynajmniej jeszcze jedna petle wokol send i kilka zmiennych pamietajacych pozycje w buforze.