Ç插口:的请求转发到端口80和读取响应

Ç插口:的请求转发到端口80和读取响应

问题描述:

我有以下代码(我是从代码工作在http://www.linuxhowtos.org/C_C++/socket.htm),其我试图变成代理服务器:Ç插口:的请求转发到端口80和读取响应

#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”我想写'缓冲区'到端口80,读取响应并通过端口20000(argv [1])写回这个响应。

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

任何指针在正确的方向非常赞赏。

这里就是我SOFAR试过(取代多行注释“转发邮件到端口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头,做一些替换并转发修改后的HTTP请求。

+0

Ouch。听起来很棘手......我不知道我在这里得到了什么。感谢您的洞察力。我想我一次只能采取一步。 – Eamorr