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

このページまたはこのページの例を参照して、サーバー側で有効な 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 に答える
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(どのクライアントを使用しているかは明らかにしません)。しかし、その他の 3 つの明白な問題は、最後の行が終了していないこと、応答自体が空白行で終了していないこと、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 に答える