C 套接字 : forward a request to port 80 and read response

标签 c sockets proxy

我有以下代码(我正在使用 http://www.linuxhowtos.org/C_C++/socket.htm 处的代码工作),我试图将其转换为代理服务器:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

void dostuff(int); /* function prototype */
void error(const char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{
     //setup proxy:
     int sockfd, newsockfd, portno, pid;
     socklen_t clilen;
     struct sockaddr_in serv_addr, cli_addr;

     if (argc < 2) {
         fprintf(stderr,"***ERROR, no port provided\n");
         exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0)
        error("***ERROR opening socket");
     bzero((char *) &serv_addr, sizeof(serv_addr));
     portno = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);
     if (bind(sockfd, (struct sockaddr *) &serv_addr,
              sizeof(serv_addr)) < 0)
              error("***ERROR on binding");
     listen(sockfd,5);
     clilen = sizeof(cli_addr);
     while (1) {
         newsockfd = accept(sockfd,
               (struct sockaddr *) &cli_addr, &clilen);
         if (newsockfd < 0)
             error("***ERROR on accept");
         pid = fork();
         if (pid < 0)
             error("***ERROR on fork");
             if (pid == 0)  {
             close(sockfd);
             dostuff(newsockfd);
             exit(0);
         }
         else close(newsockfd);
     } /* end of while */
     close(sockfd);
     return 0; /* we never get here */
}

/******** DOSTUFF() *********************
 There is a separate instance of this function 
 for each connection.  It handles all communication
 once a connnection has been established.
 *****************************************/
void dostuff (int sock)
{
   int n;
   char buffer[256];

   bzero(buffer,256);
   n = read(sock,buffer,255);
   if (n < 0){
       error("***ERROR reading from socket");
   }
   //printf("Here is the message: %s\n",buffer);




   /*
   ***Forward message to port 80 and read response here
   */





   n = write(sock,"I got your message",18);
   if (n < 0) error("***ERROR writing to socket");
}

在函数“dostuff”中,我想将“buffer”写入端口 80,读取响应并通过端口 20000 (argv[1]) 将此响应写回。

目前,当我将浏览器的代理设置为 172.16.1.218:20000 时,我得到的只是“我收到了您的消息”。我想将其更改为网页的响应!

非常感谢任何正确方向的指点。

这是我到目前为止所尝试过的(用此代码替换多行注释“将消息转发到端口 80 并在此处读取响应”):

   int sockfdi, portnoi, ni;
   struct sockaddr_in serv_addri;
   struct hostent *serveri;
   portnoi =80;

   sockfdi = socket(AF_INET, SOCK_STREAM, 0);
   if (sockfdi < 0){
        error("***ERROR opening socket");
   }
   serveri = gethostbyname("172.16.1.218");
   if (serveri == NULL){
       fprintf(stderr,"***ERROR, no such host\n");
       exit(0);
   }

   bzero((char *) &serv_addri, sizeof(serv_addri));
   serv_addri.sin_family = AF_INET;
   bcopy((char *)serveri->h_addr, (char *)&serv_addri.sin_addr.s_addr, serveri->h_length);
   serv_addri.sin_port = htons(portnoi);
   if (connect(sockfdi,(struct sockaddr *) &serv_addri,sizeof(serv_addri)) < 0){
       error("***ERROR connecting");
   }
   printf("Please enter the message: ");
   bzero(buffer,256);

但是每次我尝试通过网络浏览器连接时,服务器都会回显:“***连接错误:连接被拒绝”

提前非常感谢,

最佳答案

这是您打算执行的一项重要任务。目前,您缺少三件事,一件简单,两件事困难:

  1. 您必须打开与要将调用转发到的服务器的网络连接(相当简单,请参阅 socket()connect()) .

  2. 然后,您将拥有一个双工连接,即两个并发数据流,一个从客户端到转发的服务器,一个从转发的服务器到客户端。为了应对这种并发性,您要么需要两个具有阻塞 I/O 的线程,要么需要某种非阻塞 I/O(请参阅 select() 或 AIO)。

    <
  3. 如果您在不更改的情况下将 HTTP 请求转发到另一台服务器,则请求中可能会出现无效的服务器名称和 IP 地址。然后该请求将被拒绝。因此,您需要解析 HTTP header ,进行一些替换并转发修改后的 HTTP 请求。

关于C 套接字 : forward a request to port 80 and read response,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7064498/

相关文章:

c - 在 Sublime Text 3 中构建 C 文件并使用 fork();

c - 套接字代码在 main 中工作,但在其他功能中失败

javascript - Node.js、net.socket、解码西里尔字符

proxy - OpenFire/XMPP 503 服务不可用错误(使用 iOS XMPPFramework 的 XEP-0065)

c - 从 USB 端口启动 OS(XV6)

c - 我写了这段代码用于选择排序,但它什么也没做

c++ - 混合 C 和 C++ 时出错

java - 如何使用服务器重定向客户端以直接相互连接

node.js - getaddrinfo EAI_AGAIN registry.npmjs.org :80

apache - 如何使 Apache 将 http 请求代理到 https