Ç插口:的请求转发到端口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);
但每次我试着通过网页浏览器连接,服务器回声:“***错误连接:连接被拒绝”
提前许多感谢,
答
这是你准备做一个不平凡的任务。目前,你错过了三件事情,一个简单的一个和两个困难的问题:
你要打开网络连接到要呼叫转发到服务器(比较容易,看到
socket()
和connect()
) 。然后,您将有一个双工连接,即两个并发的数据流,一个从客户端到转发服务器,另一个从转发服务器到客户端。为了应对这种并发性,您需要两个阻塞I/O的线程或某种非阻塞I/O(请参阅
select()
或AIO)。如果您转发HTTP请求而未更改其他服务器,则可能最终会在请求中包含无效的服务器名称和IP地址。该请求将被拒绝。所以你需要解析HTTP头,做一些替换并转发修改后的HTTP请求。
Ouch。听起来很棘手......我不知道我在这里得到了什么。感谢您的洞察力。我想我一次只能采取一步。 – Eamorr