2012-08-16 23 views
0

我正在使用以下代碼重定向客戶端請求。但是,在執行以下操作時,客戶端不會重定向。它在瀏覽器中顯示「無法連接」。我使用iptables將客戶端重定向到8080端口。並運行以下可執行文件重定向。如何重定向客戶端。請提供溶液....重定向到c中的網站

#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); 
} 
} 
+0

你需要發送一個位置:XXX在http輸出的標題和狀態301(永久移動) – Ulterior 2012-08-16 07:10:43

+0

如何添加該行。請提供代碼.. – user1216216 2012-08-16 07:11:33

+0

您需要先創建一個有效的HTTP響應,請谷歌什麼協議要求最低 - 在你的情況下,你只是發送一個HTML身體沒有http狀態和標頭 – Ulterior 2012-08-16 07:13:21

回答

0

請參閱例如在this pagethis page構建在服務器端的有效的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 
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(你不說你正在使用的客戶端) 。但是,另外三個明顯的問題是最後一行沒有終止,響應本身沒有以空行結束,並且您有標頭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正確重定向規則。

+0

我正在運行代碼在端口8080.和我有一個iptable規則將客戶端重定向到端口8080.所以,每當一個客戶端連接重定向到這個端口,我在端口8080運行這個重定向器。因此,客戶端一次又一次地擊中僅限端口8080。所以它沒有被重定向。請爲我提供一個正確重定向的解決方案。 – user1216216 2012-08-28 12:59:19

+0

@ user1216216:由於您從未提供過您使用的規則,因此我無法告訴您您做錯了什麼。 – jxh 2012-08-28 15:14:58

+0

iptables -t nat -A PREROUTING -p tcp -j REDIRECT - 對端口8080 這是我用來重定向到端口8080的規則。由於我重定向到這個端口,所有請求都通過端口並在給定的程序中我重定向到某個網站[www.google.com],這也通過端口8080.因此,客戶端在端口8080循環..然後我沒有得到重定向頁面在我的瀏覽器中現在告訴我如何將客戶端重定向到端口8080和端口8080,客戶端應該被重定向到其他網站..?。 – user1216216 2012-09-17 07:14:25