0

我正在使用以下代码重定向客户端请求。但是在执行以下操作时,客户端不会被重定向。它在浏览器中显示“无法连接”。我使用 iptables 将客户端重定向到端口 8080。并运行以下可执行文件进行重定向。如何重定向客户端。请提供解决方案......

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <time.h> 

#include<stdlib.h>

int main(int argc, char *argv[])
{
int listenfd = 0, connfd = 0;
struct sockaddr_in serv_addr; 

char *reply = "HTTP/1.1 301 Moved Permanently\nServer: Apache/2.2.3\nLocation: 
http://www.google.com\nContent-Length: 1000\nConnection: close\nContent-Type:  
text/html; charset=UTF-8";

char sendBuff[1025];
time_t ticks; 

listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));
memset(sendBuff, '0', sizeof(sendBuff)); 

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(8080); 


bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

listen(listenfd, 10); 

while(1)
{
    connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); 

printf("client connected\n");
    send(connfd, reply, strlen(reply), 0);

    close(connfd);
    sleep(1);
 }
 }
4

2 回答 2

0

我无法重现您看到的错误。您应该提供更多详细信息(例如,什么样的客户端、iptables 规则的确切文本)。对于我的测试,我没有设置任何 iptables 规则,而是将 Firefox 12.0 浏览器直接指向localhost:8080.

拆分您的回复以便更容易阅读显示:

char *reply =
"HTTP/1.1 301 Moved Permanently\n"
"Server: Apache/2.2.3\n"
"Location: http://www.google.com\n"
"Content-Length: 1000\n"
"Connection: close\n"
"Content-Type: text/html; charset=UTF-8"
;

尽管RFC指定\r\n了行终止符,但大多数客户端都会接受\n(您不会说您使用的是哪个客户端)。但是,另外三个明显的问题是最后一行没有终止,响应本身没有被空行终止,并且您有一个 的Content-Length标题1000,但没有内容。这些问题中的任何一个都可能导致客户端将响应视为无效并忽略它。

char *reply =
"HTTP/1.1 301 Moved Permanently\r\n"
"Server: Apache/2.2.3\r\n"
"Location: http://www.google.com\r\n"
"Content-Length: 0\r\n"
"Connection: close\r\n"
"Content-Type: text/html; charset=UTF-8\r\n"
"\r\n"
;

进一步阅读您的代码,您在发送回复后立即关闭连接,而无需先阅读请求。这可能会导致(尽管不太可能)在请求完全传送到服务器之前关闭连接的竞争。然后,当请求确实到达时,它将触发对客户端的重置,并且可能会丢弃响应。因此,您应该添加代码以使您的回复的传递更加健壮:

printf("client connected\n");
send(connfd, reply, strlen(reply), 0);
shutdown(connfd, SHUT_WR);
while (recv(connfd, sendBuff, sizeof(sendBuff), 0) > 0) {}
close(connfd);

但是,鉴于我无法按原样重现您的响应问题,您也可能没有正确设置 iptable 重定向规则。

于 2012-08-16T14:55:31.950 回答
0

请参考本页本页中的示例在服务器端构造一个有效的 http 响应。然后,在其下方添加您的 html 正文。

你需要的最低限度是

 HTTP/1.1 200 OK
 Content-Length: XXXXX <- put size of the your html body 
 Connection: close
 Content-Type: text/html; charset=UTF-8
于 2012-08-16T07:22:28.950 回答