1
0

tcp_proxy_server.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /*
  2. * tcp proxy server
  3. *
  4. * @build: make clean && make examples WITH_OPENSSL=yes
  5. * @http_server: bin/httpd -s restart -d
  6. * @proxy_server: bin/tcp_proxy_server 8888 127.0.0.1:8080
  7. * bin/tcp_proxy_server 8888 127.0.0.1:8443
  8. * bin/tcp_proxy_server 8888 www.baidu.com
  9. * bin/tcp_proxy_server 8888 www.baidu.com:443
  10. * @client: bin/curl -v 127.0.0.1:8888
  11. * bin/nc 127.0.0.1 8888
  12. * > GET / HTTP/1.1
  13. * > Connection: close
  14. * > [Enter]
  15. * > GET / HTTP/1.1
  16. * > Connection: keep-alive
  17. * > [Enter]
  18. */
  19. #include "hloop.h"
  20. #include "hsocket.h"
  21. static char proxy_host[64] = "127.0.0.1";
  22. static int proxy_port = 80;
  23. static int proxy_ssl = 0;
  24. // hloop_create_tcp_server -> on_accept -> hio_setup_tcp_upstream
  25. static void on_accept(hio_t* io) {
  26. /*
  27. printf("on_accept connfd=%d\n", hio_fd(io));
  28. char localaddrstr[SOCKADDR_STRLEN] = {0};
  29. char peeraddrstr[SOCKADDR_STRLEN] = {0};
  30. printf("accept connfd=%d [%s] <= [%s]\n", hio_fd(io),
  31. SOCKADDR_STR(hio_localaddr(io), localaddrstr),
  32. SOCKADDR_STR(hio_peeraddr(io), peeraddrstr));
  33. */
  34. if (proxy_port % 1000 == 443) proxy_ssl = 1;
  35. hio_setup_tcp_upstream(io, proxy_host, proxy_port, proxy_ssl);
  36. }
  37. int main(int argc, char** argv) {
  38. if (argc < 3) {
  39. printf("Usage: %s port proxy_host:proxy_port\n", argv[0]);
  40. return -10;
  41. }
  42. int port = atoi(argv[1]);
  43. char* pos = strchr(argv[2], ':');
  44. if (pos) {
  45. int len = pos - argv[2];
  46. if (len > 0) {
  47. memcpy(proxy_host, argv[2], len);
  48. proxy_host[len] = '\0';
  49. }
  50. proxy_port = atoi(pos + 1);
  51. } else {
  52. strncpy(proxy_host, argv[2], sizeof(proxy_host));
  53. }
  54. if (proxy_port == 0) proxy_port = 80;
  55. printf("proxy: [%s:%d]\n", proxy_host, proxy_port);
  56. hloop_t* loop = hloop_new(0);
  57. hio_t* listenio = hloop_create_tcp_server(loop, "0.0.0.0", port, on_accept);
  58. if (listenio == NULL) {
  59. return -20;
  60. }
  61. printf("listenfd=%d\n", hio_fd(listenio));
  62. hloop_run(loop);
  63. hloop_free(&loop);
  64. return 0;
  65. }